From 212a22112855f8531e29e54f0db872ec4f0f4b7e Mon Sep 17 00:00:00 2001 From: thiery Date: Thu, 10 Aug 2006 09:21:22 +0000 Subject: [PATCH 1/1] Use a mallocator for MSG tasks git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2706 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/msg/global.c | 5 +++++ src/msg/private.h | 7 +++++++ src/msg/task.c | 31 ++++++++++++++++++++++++------- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/msg/global.c b/src/msg/global.c index 3910a414e1..26faad1ae1 100644 --- a/src/msg/global.c +++ b/src/msg/global.c @@ -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->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_mallocator_free(msg_global->task_mallocator); if(msg_global->paje_output) { fclose(msg_global->paje_output); diff --git a/src/msg/private.h b/src/msg/private.h index af95d1a13c..697381fba0 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -16,6 +16,7 @@ #include "xbt/dict.h" #include "xbt/context.h" #include "xbt/config.h" +#include "xbt/mallocator.h" /**************** datatypes **********************************/ @@ -87,6 +88,8 @@ typedef struct MSG_Global { 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; @@ -123,6 +126,10 @@ int __MSG_process_isBlocked(m_process_t process); 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) \ diff --git a/src/msg/task.c b/src/msg/task.c index 84d6f90b38..e1f3f7a850 100644 --- a/src/msg/task.c +++ b/src/msg/task.c @@ -45,12 +45,11 @@ 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->simdata = simdata; 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; - 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); - free(task->simdata); - free(task); - + xbt_mallocator_release(msg_global->task_mallocator, task); 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); } + +/* 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)); +} -- 2.20.1