Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use a mallocator for MSG tasks
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 10 Aug 2006 09:21:22 +0000 (09:21 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 10 Aug 2006 09:21:22 +0000 (09:21 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2706 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/msg/global.c
src/msg/private.h
src/msg/task.c

index 3910a41..26faad1 100644 (file)
@@ -54,6 +54,10 @@ void MSG_global_init(int *argc, char **argv)
     msg_global->current_process = NULL;
     msg_global->registered_functions = xbt_dict_new();
     msg_global->PID = 1;
     msg_global->current_process = NULL;
     msg_global->registered_functions = xbt_dict_new();
     msg_global->PID = 1;
+    msg_global->task_mallocator = xbt_mallocator_new(256,
+                                                    (pvoid_f_void_t*) task_mallocator_new_f,
+                                                    (void_f_pvoid_t*) task_mallocator_free_f,
+                                                    (void_f_pvoid_t*) task_mallocator_reset_f);
   }
 }
 
   }
 }
 
@@ -540,6 +544,7 @@ MSG_error_t MSG_clean(void)
   xbt_fifo_free(msg_global->process_to_run);
   xbt_fifo_free(msg_global->process_list);
   xbt_dict_free(&(msg_global->registered_functions));
   xbt_fifo_free(msg_global->process_to_run);
   xbt_fifo_free(msg_global->process_list);
   xbt_dict_free(&(msg_global->registered_functions));
+  xbt_mallocator_free(msg_global->task_mallocator);
 
   if(msg_global->paje_output) {
     fclose(msg_global->paje_output);
 
   if(msg_global->paje_output) {
     fclose(msg_global->paje_output);
index af95d1a..697381f 100644 (file)
@@ -16,6 +16,7 @@
 #include "xbt/dict.h"
 #include "xbt/context.h"
 #include "xbt/config.h"
 #include "xbt/dict.h"
 #include "xbt/context.h"
 #include "xbt/config.h"
+#include "xbt/mallocator.h"
 
 /**************** datatypes **********************************/
 
 
 /**************** datatypes **********************************/
 
@@ -87,6 +88,8 @@ typedef struct MSG_Global {
   int paje_maxPID;
   int PID;
   int session;
   int paje_maxPID;
   int PID;
   int session;
+  xbt_mallocator_t task_mallocator;
+  xbt_mallocator_t task_simdata_mallocator;
 } s_MSG_Global_t, *MSG_Global_t;
 
 extern MSG_Global_t msg_global;
 } s_MSG_Global_t, *MSG_Global_t;
 
 extern MSG_Global_t msg_global;
@@ -123,6 +126,10 @@ int __MSG_process_isBlocked(m_process_t process);
 
 void __MSG_display_process_status(void);
 
 
 void __MSG_display_process_status(void);
 
+m_task_t task_mallocator_new_f(void);
+void task_mallocator_free_f(m_task_t task);
+void task_mallocator_reset_f(m_task_t task);
+
 #ifdef ALVIN_SPECIAL_LOGING
 #define PAJE_PROCESS_STATE(process,state)\
   if(msg_global->paje_output) \
 #ifdef ALVIN_SPECIAL_LOGING
 #define PAJE_PROCESS_STATE(process,state)\
   if(msg_global->paje_output) \
index 84d6f90..e1f3f7a 100644 (file)
 m_task_t MSG_task_create(const char *name, double compute_duration,
                         double message_size, void *data)
 {
 m_task_t MSG_task_create(const char *name, double compute_duration,
                         double message_size, void *data)
 {
-  simdata_task_t simdata = xbt_new0(s_simdata_task_t,1);
-  m_task_t task = xbt_new0(s_m_task_t,1);
+  m_task_t task = xbt_mallocator_get(msg_global->task_mallocator);
+  simdata_task_t simdata = task->simdata;
   
   /* Task structure */
   task->name = xbt_strdup(name);
   
   /* Task structure */
   task->name = xbt_strdup(name);
-  task->simdata = simdata;
   task->data = data;
 
   /* Simulator Data */
   task->data = data;
 
   /* Simulator Data */
@@ -121,7 +120,6 @@ const char *MSG_task_get_name(m_task_t task)
 MSG_error_t MSG_task_destroy(m_task_t task)
 {
   surf_action_t action = NULL;
 MSG_error_t MSG_task_destroy(m_task_t task)
 {
   surf_action_t action = NULL;
-
   xbt_assert0((task != NULL), "Invalid parameter");
 
   task->simdata->using--;
   xbt_assert0((task != NULL), "Invalid parameter");
 
   task->simdata->using--;
@@ -140,9 +138,7 @@ MSG_error_t MSG_task_destroy(m_task_t task)
   if(action) action->resource_type->common_public->action_free(action);
   if(task->simdata->host_list) xbt_free(task->simdata->host_list);
 
   if(action) action->resource_type->common_public->action_free(action);
   if(task->simdata->host_list) xbt_free(task->simdata->host_list);
 
-  free(task->simdata);
-  free(task);
-
+  xbt_mallocator_release(msg_global->task_mallocator, task);
   return MSG_OK;
 }
 
   return MSG_OK;
 }
 
@@ -238,3 +234,24 @@ void MSG_task_set_priority(m_task_t task, double priority) {
     surf_workstation_resource->common_public->
       set_priority(task->simdata->compute, task->simdata->priority);
 }
     surf_workstation_resource->common_public->
       set_priority(task->simdata->compute, task->simdata->priority);
 }
+
+/* Mallocator functions */
+m_task_t task_mallocator_new_f(void) {
+  m_task_t task = xbt_new(s_m_task_t, 1);
+  simdata_task_t simdata = xbt_new0(s_simdata_task_t, 1);
+  task->simdata = simdata;
+  return task;
+}
+
+void task_mallocator_free_f(m_task_t task) {
+  xbt_assert0((task != NULL), "Invalid parameter");
+
+  xbt_free(task->simdata);
+  xbt_free(task);
+
+  return;
+}
+
+void task_mallocator_reset_f(m_task_t task) {
+  memset(task->simdata, 0, sizeof(s_simdata_task_t));  
+}