Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The process list of MSG is now a swag instead of a fifo.
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 3 Feb 2011 13:20:47 +0000 (13:20 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 3 Feb 2011 13:20:47 +0000 (13:20 +0000)
When a process finishes, MSG removes it from the list and this operation
was not efficient with a fifo.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9570 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/msg/datatypes.h
src/msg/global.c
src/msg/m_process.c
src/msg/private.h

index 12ae210..d77e876 100644 (file)
@@ -83,6 +83,7 @@ typedef struct simdata_process *simdata_process_t;
 /** @brief Process datatype 
     @ingroup m_datatypes_management_details @{ */
 typedef struct m_process {
+  s_xbt_swag_hookup_t process_list_hookup;
   char *name;                   /**< @brief process name if any */
   simdata_process_t simdata;
                                 /**< @brief simulator data */
index 46f25b5..9ac1659 100644 (file)
@@ -64,8 +64,9 @@ void MSG_global_init(int *argc, char **argv)
 
     msg_global = xbt_new0(s_MSG_Global_t, 1);
 
+    s_m_process_t p;
+    msg_global->process_list = xbt_swag_new(xbt_swag_offset(p, process_list_hookup));
     msg_global->host = xbt_fifo_new();
-    msg_global->process_list = xbt_fifo_new();
     msg_global->max_channel = 0;
     msg_global->PID = 1;
     msg_global->sent_msg = 0;
@@ -164,7 +165,7 @@ int MSG_process_killall(int reset_PIDs)
   m_process_t p = NULL;
   m_process_t self = MSG_process_self();
 
-  while ((p = xbt_fifo_pop(msg_global->process_list))) {
+  while ((p = xbt_swag_extract(msg_global->process_list))) {
     if (p != self)
       MSG_process_kill(p);
   }
@@ -191,7 +192,7 @@ MSG_error_t MSG_clean(void)
   TRACE_surf_release();
 #endif
 
-  while ((p = xbt_fifo_pop(msg_global->process_list))) {
+  while ((p = xbt_swag_extract(msg_global->process_list))) {
     MSG_process_kill(p);
   }
 
@@ -199,7 +200,7 @@ MSG_error_t MSG_clean(void)
     __MSG_host_destroy(h);
   }
   xbt_fifo_free(msg_global->host);
-  xbt_fifo_free(msg_global->process_list);
+  xbt_swag_free(msg_global->process_list);
 
   free(msg_global);
   msg_global = NULL;
index d6598a9..3dfb684 100644 (file)
@@ -40,8 +40,8 @@ void __MSG_process_cleanup(smx_process_t smx_proc)
   TRACE_msg_process_end(proc);
 #endif
 
-  if(msg_global)
-    xbt_fifo_remove(msg_global->process_list, proc);
+  if (msg_global)
+    xbt_swag_remove(proc, msg_global->process_list);
 
   SIMIX_process_cleanup(smx_proc);
   if (proc->name) {
@@ -175,7 +175,7 @@ m_process_t MSG_process_create_with_environment(const char *name,
   process->name = xbt_strdup(name);
   process->simdata = simdata;
   process->data = data;
-  xbt_fifo_unshift(msg_global->process_list, process);
+  xbt_swag_insert(process, msg_global->process_list);
 
   /* Let's create the process: SIMIX may decide to start it right now,
    * even before returning the flow control to us */
@@ -185,7 +185,7 @@ m_process_t MSG_process_create_with_environment(const char *name,
   if (!simdata->s_process) {
     /* Undo everything we have just changed */
     msg_global->PID--;
-    xbt_fifo_remove(msg_global->process_list, process);
+    xbt_swag_remove(process, msg_global->process_list);
     xbt_free(process->name);
     xbt_free(process);
     xbt_free(simdata);
@@ -227,7 +227,7 @@ void MSG_process_kill(m_process_t process)
     SIMIX_req_comm_cancel(p_simdata->waiting_task->simdata->comm);
   }
  
-  xbt_fifo_remove(msg_global->process_list, process);
+  xbt_swag_remove(process, msg_global->process_list);
   SIMIX_req_process_kill(process->simdata->s_process);
 
   return;
@@ -305,10 +305,9 @@ m_host_t MSG_process_get_host(m_process_t process)
  */
 m_process_t MSG_process_from_PID(int PID)
 {
-  xbt_fifo_item_t i = NULL;
   m_process_t process = NULL;
 
-  xbt_fifo_foreach(msg_global->process_list, i, process, m_process_t) {
+  xbt_swag_foreach(process, msg_global->process_list) {
     if (MSG_process_get_PID(process) == PID)
       return process;
   }
index d5f7282..aec09a2 100644 (file)
@@ -81,7 +81,7 @@ typedef struct msg_comm {
 /************************** Global variables ********************************/
 typedef struct MSG_Global {
   xbt_fifo_t host;
-  xbt_fifo_t process_list;
+  xbt_swag_t process_list;
   int max_channel;
   int PID;
   int session;