Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add some bindings for lua that enable to add properties into a resource and to contro...
authormehdi <mido.peace@gmail.com>
Mon, 11 Apr 2011 11:49:11 +0000 (13:49 +0200)
committermehdi <mido.peace@gmail.com>
Mon, 11 Apr 2011 11:49:11 +0000 (13:49 +0200)
src/bindings/lua/lua_console.c
src/bindings/lua/simgrid_lua.c
src/bindings/lua/simgrid_lua.h

index 30c9d6b..eeda51d 100644 (file)
@@ -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,
 
 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
 {
   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,
 
   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->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;
   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;
 {
        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;
        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);
 
    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);
         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");
      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) {
    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,",");
                           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;
 
          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
 }
 /*
  * 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,
          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){
          }
          // 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);
 }
 
        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();
 int console_parse_platform()
 {
        return surf_parse_bypass_platform();
index 593f56f..c908712 100644 (file)
@@ -163,8 +163,8 @@ static int Task_destroy(lua_State * L)
 static int Task_send(lua_State * L)
 {
   //stackDump("send ",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);
   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;
 }
 
   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},
 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},
   {"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}
 };
 
   {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) {
   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));
   }
   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)
 {
 
 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;
 }
 
        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                            */
 /* ********************************************************************************* */
 /* ********************************************************************************* */
 /*                           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);
   lua_pop(L, 1);
   //add to the process list
   xbt_dynar_push(process_list, &process);
-
   return 0;
   return 0;
-
 }
 
 
 }
 
 
@@ -452,9 +532,12 @@ static const luaL_reg Host_methods[] = {
   {"number", Host_number},
   {"at", Host_at},
   {"self",Host_self},
   {"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},
   // Bypass XML Methods
   {"setFunction", console_set_function},
+  {"setProperty", console_host_set_property},
   {0, 0}
 };
 
   {0, 0}
 };
 
index 3bbca15..9a56e3f 100644 (file)
@@ -71,6 +71,7 @@ typedef struct t_host_attr {
   //deployment attribute
   const char *function;
   xbt_dynar_t args_list;
   //deployment attribute
   const char *function;
   xbt_dynar_t args_list;
+  xbt_dict_t properties;
 } host_attr, *p_host_attr;
 
 
 } 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_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);
 
 int console_parse_platform(void);
 int console_parse_application(void);