static int timer_lua_create(lua_State *L) { mrp_context_t *ctx = mrp_lua_get_murphy_context(); char e[128] = ""; timer_lua_t *t; int narg; if (ctx == NULL) luaL_error(L, "failed to get murphy context"); narg = lua_gettop(L); t = (timer_lua_t *)mrp_lua_create_object(L, TIMER_LUA_CLASS, NULL, 0); t->L = L; t->ctx = ctx; t->callback = LUA_NOREF; t->data = LUA_NOREF; switch (narg) { case 1: break; case 2: if (mrp_lua_init_members(t, L, -2, e, sizeof(e)) != 1) return luaL_error(L, "failed to initialize timer members (%s)", e); break; default: return luaL_error(L, "expecting 0 or 1 constructor arguments, " "got %d", narg); } if (t->callback != LUA_NOREF && t->t == NULL) { t->t = mrp_add_timer(t->ctx->ml, t->msecs, timer_lua_cb, t); if (t->t == NULL) { mrp_lua_destroy_object(L, NULL, 0, t); return luaL_error(L, "failed to create Murphy timer"); } } mrp_lua_push_object(L, t); return 1; }
static int resource_set_lua_create(lua_State *L) { char e[128] = ""; resource_set_lua_t *rset; int narg; mrp_htbl_config_t conf; mrp_debug("create"); narg = lua_gettop(L); rset = (resource_set_lua_t *) mrp_lua_create_object(L, RESOURCE_SET_LUA_CLASS, NULL, 0); if (!rset) return luaL_error(L, "could not create Lua object"); rset->L = L; /* user can affect these values */ rset->zone = mrp_strdup("default"); rset->application_class = NULL; rset->autorelease = FALSE; rset->dont_wait = FALSE; rset->priority = 0; rset->committed = FALSE; rset->initialized = FALSE; switch (narg) { case 2: /* argument table */ if (mrp_lua_init_members(rset, L, -2, e, sizeof(e)) != 1) return luaL_error(L, "failed to initialize resource members (%s)", e); break; default: return luaL_error(L, "expecting a constructor argument, " "got %d", narg); } if (rset->application_class == NULL) return luaL_error(L, "application_class is a mandatory parameter"); if (rset->priority < 0) rset->priority = 0; /* initial state, these cannot be set by user */ rset->available = FALSE; rset->acquired = FALSE; /* initialize resource map */ conf.nbucket = 0; conf.nentry = 10; conf.comp = mrp_string_comp; conf.hash = mrp_string_hash; conf.free = htbl_free_resource; rset->resources = mrp_htbl_create(&conf); if (!rset->resources) goto error; /* do the actual resource work */ if (!client) { /* create the resource client */ client = mrp_resource_client_create("lua", NULL); if (!client) goto error; } rset->resource_set = mrp_resource_set_create(client, rset->autorelease, rset->dont_wait, rset->priority, event_cb, rset); if (rset->resource_set) n_sets++; else goto error; rset->initialized = TRUE; mrp_lua_push_object(L, rset); return 1; error: return luaL_error(L, "internal resource library error"); }
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"); }