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; }
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; }
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; }
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; }
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"); }