From: mehdi Date: Mon, 11 Apr 2011 11:49:11 +0000 (+0200) Subject: add some bindings for lua that enable to add properties into a resource and to contro... X-Git-Tag: v3.6_beta2~57^2^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f87eb709418e56ffc0ec34a0692aae093e381f90 add some bindings for lua that enable to add properties into a resource and to control native processes (useful for splay integration) --- diff --git a/src/bindings/lua/lua_console.c b/src/bindings/lua/lua_console.c index 30c9d6b0e0..eeda51d9f1 100644 --- a/src/bindings/lua/lua_console.c +++ b/src/bindings/lua/lua_console.c @@ -31,7 +31,7 @@ static void create_AS(const char *id, const char *mode) static void create_host(const char *id, double power_peak, double power_sc, const char *power_tr,int core,int state_init, - const char *state_tr) + const char *state_tr,xbt_dict_t properties) { double power_scale = 1.0; int core_nb = 1; //default value @@ -57,8 +57,7 @@ static void create_host(const char *id, double power_peak, double power_sc, surf_host_create_resource(xbt_strdup(id), power_peak, power_scale, power_trace, core_nb, state_initial, state_trace, - current_property_set); - current_property_set = NULL; + properties); } /** @@ -349,6 +348,7 @@ static int Host_new(lua_State * L) host->state_initial = state_initial; host->state_trace = state_trace; host->function = NULL; + host->properties = xbt_dict_new(); xbt_dynar_push(current_as->host_list_d, &host); return 0; @@ -604,22 +604,22 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar { p_AS_attr p_as; p_host_attr p_host; - const char *host; - const char *function; + unsigned int i,j; + const char *host_id ; + const char *function_id; const char *args; char * tmp_arg; - unsigned int i,j; if (lua_istable(L, -1)) { // get Host id lua_pushstring(L, "host"); lua_gettable(L, -2); - host = lua_tostring(L, -1); + host_id = lua_tostring(L, -1); lua_pop(L, 1); // get Function Name lua_pushstring(L, "fct"); lua_gettable(L, -2); - function = lua_tostring(L, -1); + function_id = lua_tostring(L, -1); lua_pop(L, 1); //get args lua_pushstring(L,"args"); @@ -636,8 +636,8 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar xbt_dynar_foreach(as_list_d, i, p_as) { xbt_dynar_foreach(p_as->host_list_d, j, p_host) { - if (p_host->id == host) { - p_host->function = function; + if (p_host->id == host_id) { + p_host->function = function_id; p_host->args_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref); // split & fill the args list tmp_arg = strtok((char*)args,","); @@ -649,9 +649,46 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar } } } - XBT_ERROR("Host : %s Not Found !!", host); + XBT_ERROR("Host : %s Not Found !!", host_id); return 1; +} + +static int Host_set_property(lua_State* L) +{ + p_AS_attr p_as; + p_host_attr p_host; + unsigned int i,j; + const char* host_id =""; + const char* prop_id = ""; + const char* prop_value = ""; + if (lua_istable(L, -1)) { + // get Host id + lua_pushstring(L, "host"); + lua_gettable(L, -2); + host_id = lua_tostring(L, -1); + lua_pop(L, 1); + // get Function Name + lua_pushstring(L, "prop_id"); + lua_gettable(L, -2); + prop_id = lua_tostring(L, -1); + lua_pop(L, 1); + //get args + lua_pushstring(L,"prop_value"); + lua_gettable(L, -2); + prop_value = lua_tostring(L,-1); + lua_pop(L, 1); + } + xbt_dynar_foreach(as_list_d, i, p_as) + { + xbt_dynar_foreach(p_as->host_list_d, j, p_host) { + if (p_host->id == host_id) { + xbt_dict_set(p_host->properties, prop_id, xbt_strdup(prop_value), free); + } + } + } + return 1; + } /* * surf parse bypass platform @@ -675,9 +712,11 @@ static int surf_parse_bypass_platform() xbt_dynar_foreach(p_as->host_list_d, j, p_host){ create_host(p_host->id, p_host->power_peak, p_host->power_scale, p_host->power_trace, p_host->core, p_host->state_initial, - p_host->state_trace); - //add to routing model host list - surf_route_add_host((char *) p_host->id); + p_host->state_trace, p_host->properties); + + + //add to routing model host list + surf_route_add_host((char *) p_host->id); } // add associated Links xbt_dynar_foreach(p_as->link_list_d, j, p_link){ @@ -803,6 +842,11 @@ int console_set_function(lua_State *L) return Host_set_function(L); } +int console_host_set_property(lua_State *L) +{ + return Host_set_property(L); +} + int console_parse_platform() { return surf_parse_bypass_platform(); diff --git a/src/bindings/lua/simgrid_lua.c b/src/bindings/lua/simgrid_lua.c index 593f56fae5..c908712c06 100644 --- a/src/bindings/lua/simgrid_lua.c +++ b/src/bindings/lua/simgrid_lua.c @@ -163,8 +163,8 @@ static int Task_destroy(lua_State * L) static int Task_send(lua_State * L) { //stackDump("send ",L); - m_task_t tk = checkTask(L, -2); - const char *mailbox = luaL_checkstring(L, -1); + m_task_t tk = checkTask(L, 1); + const char *mailbox = luaL_checkstring(L, 2); lua_pop(L, 1); // remove the string so that the task is on top of it MSG_task_set_data(tk, L); // Copy my stack into the task, so that the receiver can copy the lua task directly MSG_error_t res = MSG_task_send(tk, mailbox); @@ -220,6 +220,71 @@ static int Task_recv(lua_State * L) return 1; } +static int Task_recv_with_timeout(lua_State * L) +{ + m_task_t tk = NULL; + const char *mailbox = luaL_checkstring(L, -2); + int timeout = luaL_checknumber(L, -1); + MSG_error_t res = MSG_task_receive_with_timeout(&tk, mailbox, timeout); + + lua_State *sender_stack = MSG_task_get_data(tk); + lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack + MSG_task_set_data(tk, NULL); + + if (res != MSG_OK) + switch (res) { + case MSG_TIMEOUT: + XBT_ERROR("MSG_task_receive failed : Timeout"); + break; + case MSG_TRANSFER_FAILURE: + XBT_ERROR("MSG_task_receive failed : Transfer Failure"); + break; + case MSG_HOST_FAILURE: + XBT_ERROR("MSG_task_receive failed : Host Failure "); + break; + default: + XBT_ERROR + ("MSG_task_receive failed : Unexpected error , please report this bug"); + break; + } + + return 1; +} + +/** + * Static Binding for the Splay methods : event.sleep : + * it use MSG_task_irecv with MSG_comm_wait + */ +static int Task_splay_irecv(lua_State *L) +{ + m_task_t task = NULL; + msg_comm_t comm = NULL; //current communication to receive + const char *mailbox = luaL_checkstring(L, -2); + double timeout = luaL_checknumber(L, -1); + comm = MSG_task_irecv(&task, mailbox); + MSG_comm_wait(comm, timeout); + if (MSG_comm_get_status(comm) == MSG_OK) + { + lua_State *sender_stack = MSG_task_get_data(task); + lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack + MSG_task_set_data(task, NULL); + MSG_comm_destroy(comm); + } + + return 1; +} + +static int Task_splay_isend(lua_State *L) +{ + m_task_t tk = checkTask(L, 1); + const char *mailbox = luaL_checkstring(L, 2); + lua_pop(L, 1); // remove the string so that the task is on top of it + MSG_task_set_data(tk, L); // Copy my stack into the task, so that the receiver can copy the lua task directly + MSG_task_isend(tk, mailbox); + + return 1; +} + static const luaL_reg Task_methods[] = { {"new", Task_new}, {"name", Task_get_name}, @@ -228,6 +293,9 @@ static const luaL_reg Task_methods[] = { {"destroy", Task_destroy}, {"send", Task_send}, {"recv", Task_recv}, + {"recv_timeout",Task_recv_with_timeout}, + {"splay_recv",Task_splay_irecv}, + {"iSend",Task_splay_isend}, {0, 0} }; @@ -275,7 +343,7 @@ static int Host_get_by_name(lua_State * L) XBT_DEBUG("Getting Host from name..."); m_host_t msg_host = MSG_get_host_by_name(name); if (!msg_host) { - luaL_error(L, "null Host : MSG_get_host_by_name failled"); + luaL_error(L, "null Host : MSG_get_host_by_name failed"); } lua_newtable(L); /* create a table, put the userdata on top of it */ m_host_t *lua_host = (m_host_t *) lua_newuserdata(L, sizeof(m_host_t)); @@ -318,14 +386,14 @@ static int Host_at(lua_State * L) static int Host_self(lua_State * L) { - m_host_t host = MSG_host_self(); - lua_newtable(L); - m_host_t *lua_host =(m_host_t *)lua_newuserdata(L,sizeof(m_host_t)); - *lua_host = host; - luaL_getmetatable(L, HOST_MODULE_NAME); - lua_setmetatable(L, -2); - lua_setfield(L, -2, "__simgrid_host"); - return 1; + m_host_t host = MSG_host_self(); + lua_newtable(L); + m_host_t *lua_host =(m_host_t *)lua_newuserdata(L,sizeof(m_host_t)); + *lua_host = host; + luaL_getmetatable(L, HOST_MODULE_NAME); + lua_setmetatable(L, -2); + lua_setfield(L, -2, "__simgrid_host"); + return 1; } @@ -337,6 +405,20 @@ static int Host_get_property_value(lua_State * L) return 1; } +static int Host_sleep(lua_State *L) +{ + int time = luaL_checknumber(L, -1); + MSG_process_sleep(time); + return 1; +} + +static int Host_destroy(lua_State *L) +{ + m_host_t ht = checkHost(L, -1); + __MSG_host_destroy(ht); + return 1; +} + /* ********************************************************************************* */ /* lua_stub_generator functions */ /* ********************************************************************************* */ @@ -393,9 +475,7 @@ static int gras_add_process_function(lua_State * L) lua_pop(L, 1); //add to the process list xbt_dynar_push(process_list, &process); - return 0; - } @@ -452,9 +532,12 @@ static const luaL_reg Host_methods[] = { {"number", Host_number}, {"at", Host_at}, {"self",Host_self}, - {"getPropValue",Host_get_property_value}, + {"getPropValue", Host_get_property_value}, + {"sleep", Host_sleep}, + {"destroy",Host_destroy}, // Bypass XML Methods {"setFunction", console_set_function}, + {"setProperty", console_host_set_property}, {0, 0} }; diff --git a/src/bindings/lua/simgrid_lua.h b/src/bindings/lua/simgrid_lua.h index 3bbca15fbc..9a56e3f88e 100644 --- a/src/bindings/lua/simgrid_lua.h +++ b/src/bindings/lua/simgrid_lua.h @@ -71,6 +71,7 @@ typedef struct t_host_attr { //deployment attribute const char *function; xbt_dynar_t args_list; + xbt_dict_t properties; } host_attr, *p_host_attr; @@ -106,6 +107,7 @@ int console_add_link(lua_State*); int console_add_route(lua_State*); int console_add_AS(lua_State*); int console_set_function(lua_State*); +int console_host_set_property(lua_State*); int console_parse_platform(void); int console_parse_application(void);