예제 #1
0
파일: lua-resource.c 프로젝트: 01org/murphy
static int resource_set_release(lua_State *L)
{
    resource_set_lua_t *rset;

    mrp_debug("> release");

    rset = resource_set_lua_check(L, 1);

    if (!rset)
        return luaL_error(L, "internal error");

    if (!rset->committed) {

        /* Committing the resource set here means that the resource set stays
         * in released state but already receives events. */

        if (mrp_application_class_add_resource_set(rset->application_class,
            rset->zone, rset->resource_set, 0) < 0)
            return luaL_error(L, "failed to commit the resource set");

        rset->committed = TRUE;
    }

    mrp_resource_set_release(rset->resource_set, 0);

    return 0;
}
예제 #2
0
파일: lua-resource.c 프로젝트: 01org/murphy
static int resource_set_acquire(lua_State *L)
{
    resource_set_lua_t *rset;

    mrp_debug("acquire");

    rset = resource_set_lua_check(L, 1);

    if (!rset)
        return luaL_error(L, "internal error");

    if (!rset->committed) {

        /* Application backend requires us to "commit" the resource set before
         * we can use the resource set. It can be done only after all resources
         * have been added to the resource set and all the attributes
         * configured. */

        if (mrp_application_class_add_resource_set(rset->application_class,
                rset->zone, rset->resource_set, 0) < 0)
                return luaL_error(L, "failed to commit the resource set");

        rset->committed = TRUE;
    }

    mrp_resource_set_acquire(rset->resource_set, 0);

    return 0;
}
예제 #3
0
static int resource_set_release(lua_State *L)
{
    resource_set_lua_t *rset;

    mrp_debug("> release");

    rset = resource_set_lua_check(L, 1);

    if (!rset)
        return luaL_error(L, "internal error");

    mrp_resource_set_release(rset->resource_set, 0);

    return 1;
}
예제 #4
0
static int resource_set_lua_stringify(lua_State *L)
{
    resource_set_lua_t *rset;

    mrp_debug("> stringify");

    rset = resource_set_lua_check(L, 1);

    if (!rset) {
        lua_pushstring(L, "invalid resource set");
        return 1;
    }

    lua_pushfstring(L, "resource set '%s', acquired: %s, available: %s", "class",
            rset->acquired ? "yes" : "no",
            rset->available ? "yes" : "no");

    return 1;
}
예제 #5
0
파일: lua-resource.c 프로젝트: 01org/murphy
static int resource_set_add_resource(lua_State *L)
{
    int narg;
    resource_set_lua_t *rset;
    resource_lua_t *resource;
    const char *resource_name;
    bool shared = FALSE;
    bool mandatory = TRUE;
    mrp_attr_t attribute_list[MAX_ATTRS], *attrs;

    mrp_debug("> add_resource");

    narg = lua_gettop(L);

    if (narg != 2)
        return luaL_error(L, "expecting one argument");

    rset = resource_set_lua_check(L, 1);

    if (!rset)
        goto error;

    /* the argument should be a table with at least "resource_name" index */

    if (!lua_istable(L, -1))
        return luaL_error(L, "argument error -- not a table");

    lua_pushstring(L, "resource_name");
    lua_gettable(L, -2);

    if (!lua_isstring(L, -1))
        return luaL_error(L, "'resource_name' is a mandatory field");

    resource_name = lua_tostring(L, -1);
    lua_pop(L, 1);

    lua_pushstring(L, "mandatory");
    lua_gettable(L, -2);

    if (lua_isboolean(L, -1)) {
        mandatory = lua_toboolean(L, -1);
    }
    lua_pop(L, 1);

    lua_pushstring(L, "shared");
    lua_gettable(L, -2);

    if (lua_isboolean(L, -1)) {
        shared = lua_toboolean(L, -1);
    }
    lua_pop(L, 1);

    /* create resource object and add it to the resource table in the resource
     * set object */

    resource = (resource_lua_t *) mrp_lua_create_object(L, RESOURCE_LUA_CLASS,
            NULL, 0);

    if (!resource)
        goto error;

    /* mrp_lua_object_ref_value(resource, L, 0); */

    resource->mandatory = mandatory;
    resource->shared = shared;
    resource->acquired = FALSE;
    resource->available = FALSE;
    resource->resource_name = mrp_strdup(resource_name);

    if (!resource->resource_name)
        goto error;

    resource->parent = rset;
    resource->L = L;

    resource->real_attributes = (attribute_lua_t *) mrp_lua_create_object(L,
            ATTRIBUTE_LUA_CLASS, NULL, 0);

    if (!resource->real_attributes)
        goto error;

    /* mrp_lua_object_ref_value(resource->real_attributes, L, 0); */

    resource->real_attributes->L = L;
    resource->real_attributes->parent = resource;
    resource->real_attributes->resource_set = rset;
    resource->real_attributes->initialized = TRUE;

    attrs = mrp_resource_set_read_all_attributes(rset->resource_set,
            resource->resource_name, MAX_ATTRS-1, attribute_list);

    if (mrp_resource_set_add_resource(rset->resource_set,
            resource->resource_name, shared, attrs, mandatory) < 0)
        goto error;

    /* add to resource map */

    mrp_debug("inserted resource %s to %p", resource->resource_name, rset);
    mrp_htbl_insert(rset->resources, resource->resource_name, resource);

    return 0;

error:
    /* TODO: clean up the already allocated objects */

    return luaL_error(L, "internal resource library error");
}