From: thiery Date: Thu, 3 Feb 2011 13:20:47 +0000 (+0000) Subject: The process list of MSG is now a swag instead of a fifo. X-Git-Tag: v3.6_beta2~359 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/63ea61dcf159b166cad6f257cb92912971491470 The process list of MSG is now a swag instead of a fifo. 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 --- diff --git a/include/msg/datatypes.h b/include/msg/datatypes.h index 12ae210c38..d77e87634b 100644 --- a/include/msg/datatypes.h +++ b/include/msg/datatypes.h @@ -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 */ diff --git a/src/msg/global.c b/src/msg/global.c index 46f25b58a2..9ac1659c3c 100644 --- a/src/msg/global.c +++ b/src/msg/global.c @@ -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; diff --git a/src/msg/m_process.c b/src/msg/m_process.c index d6598a9c3a..3dfb68416c 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -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; } diff --git a/src/msg/private.h b/src/msg/private.h index d5f7282576..aec09a2763 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -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;