Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Factorize some code in SURF
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 30 Jun 2009 20:59:50 +0000 (20:59 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 30 Jun 2009 20:59:50 +0000 (20:59 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6403 48e7efb5-ca39-0410-a469-dd3cf9ba447f

21 files changed:
ChangeLog
src/Makefile.am
src/include/surf/surf.h
src/simdag/sd_global.c
src/simdag/sd_link.c
src/simdag/sd_task.c
src/simdag/sd_workstation.c
src/simix/smx_action.c
src/simix/smx_global.c
src/simix/smx_host.c
src/simix/smx_process.c
src/surf/cpu.c
src/surf/model.c [new file with mode: 0644]
src/surf/network.c
src/surf/network_constant.c
src/surf/network_gtnets.c
src/surf/surf.c
src/surf/surf_private.h
src/surf/surf_timer.c
src/surf/workstation.c
src/surf/workstation_ptask_L07.c

index 668673e..c5f906d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,11 @@ SimGrid (3.3.2-svn) unstable; urgency=low
  SMPI:
   * Implement MPI_Waitany and MPI_Waitall 
 
+ SURF: 
+  * Factorize model_init/exit between models
+  * Declare common_public as an embeeded struct to reduce redirections
+    and mallocs
+
  XBT:
   * Add xbt_set_get_by_name_or_null() [Silas De Munck]
   * Add xbt_graph_node_get_outedges() [Silas De Munck]
index a59dca3..098e4de 100644 (file)
@@ -169,6 +169,7 @@ XBT_SG_SRC = \
   xbt/xbt_sg_time.c     
 
 SURF_SRC= \
+  surf/model.c                                                               \
   surf/surf_config.c                                                         \
   surf/maxmin.c                                                              \
   surf/fair_bottleneck.c                                                     \
index a21d29e..9ea2ec2 100644 (file)
@@ -178,10 +178,14 @@ XBT_PUBLIC(int) find_model_description(s_surf_model_description_t * table,
  *  the CPUs and the network links are examples of models.
  */
      typedef struct surf_model {
+       s_surf_model_public_t common_public;
        surf_model_private_t common_private;
-       surf_model_public_t common_public;
      } s_surf_model_t;
 
+     void surf_model_init(surf_model_t model);
+     void surf_model_exit(surf_model_t model);
+
+
 /**************************************/
 /* Implementations of model object */
 /**************************************/
@@ -201,8 +205,8 @@ XBT_PUBLIC(int) find_model_description(s_surf_model_description_t * table,
  *  \ingroup SURF_models
  */
      typedef struct surf_timer_model {
+       s_surf_model_public_t common_public;
        surf_model_private_t common_private;
-       surf_model_public_t common_public;
        surf_timer_model_extension_public_t extension_public;
      } s_surf_timer_model_t, *surf_timer_model_t;
 
@@ -244,8 +248,8 @@ XBT_PUBLIC(void) surf_timer_model_init(const char *filename);
  *  \ingroup SURF_models
  */
      typedef struct surf_cpu_model {
+       s_surf_model_public_t common_public;
        surf_model_private_t common_private;
-       surf_model_public_t common_public;
        surf_cpu_model_extension_public_t extension_public;
      } s_surf_cpu_model_t, *surf_cpu_model_t;
 
@@ -292,8 +296,8 @@ XBT_PUBLIC_DATA(s_surf_model_description_t) surf_cpu_model_description[];
  *  \ingroup SURF_models
  */
      typedef struct surf_network_model {
+       s_surf_model_public_t common_public;
        surf_model_private_t common_private;
-       surf_model_public_t common_public;
        surf_network_model_extension_public_t extension_public;
      } s_surf_network_model_t, *surf_network_model_t;
 
@@ -464,8 +468,8 @@ XBT_PUBLIC_DATA(s_surf_model_description_t) surf_network_model_description[];
  *
  */
      typedef struct surf_workstation_model {
+       s_surf_model_public_t common_public;
        surf_model_private_t common_private;
-       surf_model_public_t common_public;
        surf_workstation_model_extension_public_t extension_public;
      } s_surf_workstation_model_t, *surf_workstation_model_t;
 
index 431dae5..4a3f62f 100644 (file)
@@ -241,7 +241,7 @@ SD_task_t *SD_simulate(double how_long)
     /* let's see which tasks are done */
     xbt_dynar_foreach(model_list, iter, model) {
       while ((action =
-              xbt_swag_extract(model->common_public->states.
+              xbt_swag_extract(model->common_public.states.
                                done_action_set))) {
         task = action->data;
         INFO1("Task '%s' done", SD_task_get_name(task));
@@ -272,12 +272,12 @@ SD_task_t *SD_simulate(double how_long)
 
       /* let's see which tasks have just failed */
       while ((action =
-              xbt_swag_extract(model->common_public->states.
+              xbt_swag_extract(model->common_public.states.
                                failed_action_set))) {
         task = action->data;
         INFO1("Task '%s' failed", SD_task_get_name(task));
         __SD_task_set_state(task, SD_FAILED);
-        surf_workstation_model->common_public->action_free(action);
+        surf_workstation_model->common_public.action_free(action);
         task->surf_action = NULL;
 
         if (!xbt_dynar_member(changed_tasks, &task))
index e01a100..fe7087d 100644 (file)
@@ -154,7 +154,7 @@ xbt_dict_t SD_link_get_properties(SD_link_t link)
   SD_CHECK_INIT_DONE();
   xbt_assert0((link != NULL), "Invalid parameters");
 
-  return (surf_workstation_model->common_public->
+  return (surf_workstation_model->common_public.
           get_properties(link->surf_link));
 
 }
index 501f2a4..ba5c414 100644 (file)
@@ -129,13 +129,13 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
   case SD_RUNNING:
     task->state_set = sd_global->running_task_set;
     task->start_time =
-      surf_workstation_model->common_public->action_get_start_time(task->
+      surf_workstation_model->common_public.action_get_start_time(task->
                                                                    surf_action);
     break;
   case SD_DONE:
     task->state_set = sd_global->done_task_set;
     task->finish_time =
-      surf_workstation_model->common_public->action_get_finish_time(task->
+      surf_workstation_model->common_public.action_get_finish_time(task->
                                                                     surf_action);
     task->remains = 0;
     break;
@@ -413,7 +413,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst)
   if (xbt_dynar_length(dst->tasks_before) == 0 && __SD_task_is_scheduled(dst))
     __SD_task_set_state(dst, SD_READY);
 
-  /*  __SD_print_dependencies(src); 
+  /*  __SD_print_dependencies(src);
      __SD_print_dependencies(dst); */
 }
 
@@ -476,7 +476,7 @@ static void __SD_print_watch_points(SD_task_t task)
  * SD_simulate() will stop as soon as the \ref e_SD_task_state_t "state" of this
  * task becomes the one given in argument. The
  * watch point is then automatically removed.
- * 
+ *
  * \param task a task
  * \param state the \ref e_SD_task_state_t "state" you want to watch
  * (cannot be #SD_NOT_SCHEDULED)
@@ -497,7 +497,7 @@ void SD_task_watch(SD_task_t task, e_SD_task_state_t state)
 
 /**
  * \brief Removes a watch point from a task
- * 
+ *
  * \param task a task
  * \param state the \ref e_SD_task_state_t "state" you no longer want to watch
  * \see SD_task_watch()
@@ -515,10 +515,10 @@ void SD_task_unwatch(SD_task_t task, e_SD_task_state_t state)
 
 /**
  * \brief Returns an approximative estimation of the execution time of a task.
- * 
+ *
  * The estimation is very approximative because the value returned is the time
  * the task would take if it was executed now and if it was the only task.
- * 
+ *
  * \param task the task to evaluate
  * \param workstation_nb number of workstations on which the task would be executed
  * \param workstation_list the workstations on which the task would be executed
@@ -570,7 +570,7 @@ double SD_task_get_execution_time(SD_task_t task,
  * The task state must be #SD_NOT_SCHEDULED.
  * Once scheduled, a task will be executed as soon as possible in SD_simulate(),
  * i.e. when its dependencies are satisfied.
- * 
+ *
  * \param task the task you want to schedule
  * \param workstation_nb number of workstations on which the task will be executed
  * \param workstation_list the workstations on which the task will be executed
@@ -645,7 +645,7 @@ void SD_task_unschedule(SD_task_t task)
     __SD_task_destroy_scheduling_data(task);
 
   if (__SD_task_is_running(task))       /* the task should become SD_FAILED */
-    surf_workstation_model->common_public->action_cancel(task->surf_action);
+    surf_workstation_model->common_public.action_cancel(task->surf_action);
   else
     __SD_task_set_state(task, SD_NOT_SCHEDULED);
   task->remains = task->amount;
@@ -769,7 +769,7 @@ void __SD_task_really_run(SD_task_t task)
     xbt_free(surf_workstations);
   }
 
-  surf_workstation_model->common_public->action_set_data(task->surf_action,
+  surf_workstation_model->common_public.action_set_data(task->surf_action,
                                                          task);
 
   DEBUG1("surf_action = %p", task->surf_action);
@@ -854,7 +854,7 @@ void __SD_task_just_done(SD_task_t task)
   candidates = xbt_new(SD_task_t, 8);
 
   __SD_task_set_state(task, SD_DONE);
-  surf_workstation_model->common_public->action_free(task->surf_action);
+  surf_workstation_model->common_public.action_free(task->surf_action);
   task->surf_action = NULL;
 
   DEBUG0("Looking for candidates");
@@ -1008,7 +1008,7 @@ double SD_task_get_start_time(SD_task_t task)
   SD_CHECK_INIT_DONE();
   xbt_assert0(task != NULL, "Invalid parameter");
   if (task->surf_action)
-    return surf_workstation_model->common_public->action_get_start_time(task->
+    return surf_workstation_model->common_public.action_get_start_time(task->
                                                                         surf_action);
   else
     return task->start_time;
@@ -1019,7 +1019,7 @@ double SD_task_get_start_time(SD_task_t task)
  *
  * The task state must be SD_RUNNING, SD_DONE or SD_FAILED.
  * If the state is not completed yet, the returned value is an
- * estimation of the task finish time. This value can fluctuate 
+ * estimation of the task finish time. This value can fluctuate
  * until the task is completed.
  *
  * \param task: a task
@@ -1031,7 +1031,7 @@ double SD_task_get_finish_time(SD_task_t task)
   xbt_assert0(task != NULL, "Invalid parameter");
 
   if (task->surf_action)        /* should never happen as actions are destroyed right after their completion */
-    return surf_workstation_model->common_public->
+    return surf_workstation_model->common_public.
       action_get_finish_time(task->surf_action);
   else
     return task->finish_time;
@@ -1062,7 +1062,7 @@ void SD_task_destroy(SD_task_t task)
     xbt_free(task->name);
 
   if (task->surf_action != NULL)
-    surf_workstation_model->common_public->action_free(task->surf_action);
+    surf_workstation_model->common_public.action_free(task->surf_action);
 
   if (task->workstation_list != NULL)
     xbt_free(task->workstation_list);
index 7d0f26e..686bc0a 100644 (file)
@@ -134,7 +134,7 @@ const char *SD_workstation_get_name(SD_workstation_t workstation)
 {
   SD_CHECK_INIT_DONE();
   xbt_assert0(workstation != NULL, "Invalid parameter");
-  return surf_workstation_model->common_public->
+  return surf_workstation_model->common_public.
     get_resource_name(workstation->surf_workstation);
 }
 
@@ -163,7 +163,7 @@ xbt_dict_t SD_workstation_get_properties(SD_workstation_t workstation)
   SD_CHECK_INIT_DONE();
   xbt_assert0((workstation != NULL), "Invalid parameters");
 
-  return (surf_workstation_model->common_public->
+  return (surf_workstation_model->common_public.
           get_properties(workstation->surf_workstation));
 
 }
index ec9ae9c..0848d34 100644 (file)
@@ -16,7 +16,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_action, simix,
 /************************************* Actions *********************************/
 /** \brief Creates a new SIMIX action to communicate two hosts.
  *
- *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a network_error exception if the host is unavailable. 
+ *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a network_error exception if the host is unavailable.
  *     \param sender SIMIX host sender
  *     \param receiver SIMIX host receiver
  *     \param name Action name
@@ -59,7 +59,7 @@ smx_action_t SIMIX_action_communicate(smx_host_t sender,
                                                           host,
                                                           receiver->simdata->
                                                           host, size, rate);
-  surf_workstation_model->common_public->action_set_data(simdata->surf_action,
+  surf_workstation_model->common_public.action_set_data(simdata->surf_action,
                                                          act);
 
   DEBUG1("Create communicate action %p", act);
@@ -68,7 +68,7 @@ smx_action_t SIMIX_action_communicate(smx_host_t sender,
 
 /** \brief Creates a new SIMIX action to execute an action.
  *
- *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a host_error exception if the host crashed. 
+ *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a host_error exception if the host crashed.
  *     \param host SIMIX host where the action will be executed
  *     \param name Action name
  *     \param amount Task amount (in bytes)
@@ -102,7 +102,7 @@ smx_action_t SIMIX_action_execute(smx_host_t host, const char *name,
     surf_workstation_model->extension_public->execute(host->simdata->host,
                                                       amount);
 
-  surf_workstation_model->common_public->action_set_data(simdata->surf_action,
+  surf_workstation_model->common_public.action_set_data(simdata->surf_action,
                                                          act);
 
   DEBUG1("Create execute action %p", act);
@@ -111,7 +111,7 @@ smx_action_t SIMIX_action_execute(smx_host_t host, const char *name,
 
 /** \brief Creates a new sleep SIMIX action.
  *
- *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a host_error exception if the host crashed. The default SIMIX name of the action is "sleep".  
+ *     This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a host_error exception if the host crashed. The default SIMIX name of the action is "sleep".
  *     \param host SIMIX host where the sleep will run.
  *     \param duration Time duration of the sleep.
  *     \return A new SIMIX action
@@ -143,7 +143,7 @@ smx_action_t SIMIX_action_sleep(smx_host_t host, double duration)
     surf_workstation_model->extension_public->sleep(host->simdata->host,
                                                     duration);
 
-  surf_workstation_model->common_public->action_set_data(simdata->surf_action,
+  surf_workstation_model->common_public.action_set_data(simdata->surf_action,
                                                          act);
 
   DEBUG1("Create sleep action %p", act);
@@ -162,7 +162,7 @@ void SIMIX_action_cancel(smx_action_t action)
 
   DEBUG1("Cancel action %p", action);
   if (action->simdata->surf_action) {
-    surf_workstation_model->common_public->action_cancel(action->
+    surf_workstation_model->common_public.action_cancel(action->
                                                          simdata->
                                                          surf_action);
   }
@@ -181,7 +181,7 @@ void SIMIX_action_set_priority(smx_action_t action, double priority)
   xbt_assert0((action != NULL)
               && (action->simdata != NULL), "Invalid parameter");
 
-  surf_workstation_model->common_public->set_priority(action->simdata->
+  surf_workstation_model->common_public.set_priority(action->simdata->
                                                       surf_action, priority);
   return;
 }
@@ -189,7 +189,7 @@ void SIMIX_action_set_priority(smx_action_t action, double priority)
 /**
  *     \brief Destroys an action
  *
- *     Destroys an action, freing its memory. This function cannot be called if there are a conditional waiting for it. 
+ *     Destroys an action, freing its memory. This function cannot be called if there are a conditional waiting for it.
  *     \param action The SIMIX action
  */
 int SIMIX_action_destroy(smx_action_t action)
@@ -213,7 +213,7 @@ int SIMIX_action_destroy(smx_action_t action)
 
   if (action->simdata->surf_action)
     action->simdata->surf_action->model_type->
-      common_public->action_free(action->simdata->surf_action);
+      common_public.action_free(action->simdata->surf_action);
 
   xbt_free(action->simdata);
   xbt_free(action);
@@ -252,7 +252,7 @@ void SIMIX_action_release(smx_action_t action)
 /**
  *     \brief Set an action to a condition
  *
- *     Creates the "link" between an action and a condition. You have to call this function when you create an action and want to wait its ending. 
+ *     Creates the "link" between an action and a condition. You have to call this function when you create an action and want to wait its ending.
  *     \param action SIMIX action
  *     \param cond SIMIX cond
  */
@@ -336,7 +336,7 @@ smx_action_t SIMIX_action_parallel_execute(char *name, int host_nb,
                                                                     amount,
                                                                     rate);
 
-  surf_workstation_model->common_public->action_set_data(simdata->surf_action,
+  surf_workstation_model->common_public.action_set_data(simdata->surf_action,
                                                          act);
 
   return act;
@@ -345,7 +345,7 @@ smx_action_t SIMIX_action_parallel_execute(char *name, int host_nb,
 e_surf_action_state_t SIMIX_action_get_state(smx_action_t action)
 {
   xbt_assert0((action != NULL), "Invalid parameter");
-  return surf_workstation_model->common_public->action_get_state(action->
+  return surf_workstation_model->common_public.action_get_state(action->
                                                                  simdata->
                                                                  surf_action);
 
index 9d261b1..a94fc2f 100644 (file)
@@ -299,8 +299,8 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
     void *arg = NULL;
 
     xbt_dynar_foreach(model_list, iter, model) {
-      if (xbt_swag_size(model->common_public->states.failed_action_set)
-          || xbt_swag_size(model->common_public->states.done_action_set)) {
+      if (xbt_swag_size(model->common_public.states.failed_action_set)
+          || xbt_swag_size(model->common_public.states.done_action_set)) {
         state_modifications = 1;
         break;
       }
@@ -339,7 +339,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
     /* Wake up all process waiting for the action finish */
     xbt_dynar_foreach(model_list, iter, model) {
       while ((action =
-              xbt_swag_extract(model->common_public->
+              xbt_swag_extract(model->common_public.
                                states.failed_action_set))) {
         smx_action = action->data;
         if (smx_action) {
@@ -347,7 +347,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
         }
       }
       while ((action =
-              xbt_swag_extract(model->common_public->
+              xbt_swag_extract(model->common_public.
                                states.done_action_set))) {
         smx_action = action->data;
         if (smx_action) {
index 9df094f..a9760f4 100644 (file)
@@ -38,7 +38,7 @@ smx_host_t __SIMIX_host_create(const char *name,
   return host;
 }
 
-/** 
+/**
  * \brief Set the user data of a #smx_host_t.
  *
  * This functions checks whether some data has already been associated to \a host or not and attach \a data to \a host if it is possible.
@@ -71,7 +71,7 @@ void *SIMIX_host_get_data(smx_host_t host)
   return (host->data);
 }
 
-/** 
+/**
  * \brief Return the name of the #smx_host_t.
  *
  * This functions checks whether \a host is a valid pointer or not and return its name.
@@ -87,7 +87,7 @@ const char *SIMIX_host_get_name(smx_host_t host)
   return (host->name);
 }
 
-/** 
+/**
  * \brief Return the location on which the current process is executed.
  *
  * Return the host,  more details in #SIMIX_process_get_host
@@ -100,7 +100,7 @@ smx_host_t SIMIX_host_self(void)
 
 /*
  * Real function for destroy a host.
- * MSG_host_destroy is just  a front_end that also removes it from 
+ * MSG_host_destroy is just  a front_end that also removes it from
  * msg_global->host
  */
 void __SIMIX_host_destroy(void *h)
@@ -233,7 +233,7 @@ xbt_dict_t SIMIX_host_get_properties(smx_host_t host)
 {
   xbt_assert0((host != NULL), "Invalid parameters");
 
-  return (surf_workstation_model->common_public->
+  return (surf_workstation_model->common_public.
           get_properties(host->simdata->host));
 
 }
index 9326ac2..a970cdf 100644 (file)
@@ -338,7 +338,7 @@ void SIMIX_process_suspend(smx_process_t process)
       simdata->suspended = 1;
       c = simdata->cond;
       xbt_fifo_foreach(c->actions, i, act, smx_action_t) {
-        surf_workstation_model->common_public->suspend(act->
+        surf_workstation_model->common_public.suspend(act->
                                                        simdata->surf_action);
       }
     } else {
@@ -353,7 +353,7 @@ void SIMIX_process_suspend(smx_process_t process)
 
     cond = SIMIX_cond_init();
     dummy = SIMIX_action_execute(SIMIX_process_get_host(process), name, 0);
-    surf_workstation_model->common_public->suspend(dummy->simdata->
+    surf_workstation_model->common_public.suspend(dummy->simdata->
                                                    surf_action);
     SIMIX_register_action_to_condition(dummy, cond);
     __SIMIX_cond_wait(cond);
@@ -396,7 +396,7 @@ void SIMIX_process_resume(smx_process_t process)
     simdata->suspended = 0;
     c = simdata->cond;
     xbt_fifo_foreach(c->actions, i, act, smx_action_t) {
-      surf_workstation_model->common_public->resume(act->simdata->
+      surf_workstation_model->common_public.resume(act->simdata->
                                                     surf_action);
     }
     SIMIX_cond_signal(c);
index e2883b9..17663c5 100644 (file)
@@ -170,11 +170,6 @@ static void action_cancel(surf_action_t action)
   return;
 }
 
-static void action_recycle(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-}
-
 static void action_change_state(surf_action_t action,
                                 e_surf_action_state_t state)
 {
@@ -191,7 +186,7 @@ static void action_change_state(surf_action_t action,
 static double share_resources(double now)
 {
   s_surf_action_cpu_Cas01_t action;
-  return generic_maxmin_share_resources(surf_cpu_model->common_public->states.
+  return generic_maxmin_share_resources(surf_cpu_model->common_public.states.
                                         running_action_set,
                                         xbt_swag_offset(action, variable),
                                         cpu_maxmin_system, lmm_solve);
@@ -202,10 +197,10 @@ static void update_actions_state(double now, double delta)
   surf_action_cpu_Cas01_t action = NULL;
   surf_action_cpu_Cas01_t next_action = NULL;
   xbt_swag_t running_actions =
-    surf_cpu_model->common_public->states.running_action_set;
+    surf_cpu_model->common_public.states.running_action_set;
   /* FIXME: UNUSED
      xbt_swag_t failed_actions =
-     surf_cpu_model->common_public->states.failed_action_set;
+     surf_cpu_model->common_public.states.failed_action_set;
    */
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
@@ -287,10 +282,10 @@ static surf_action_t execute(void *cpu, double size)
 
   if (CPU->state_current == SURF_CPU_ON)
     action->generic_action.state_set =
-      surf_cpu_model->common_public->states.running_action_set;
+      surf_cpu_model->common_public.states.running_action_set;
   else
     action->generic_action.state_set =
-      surf_cpu_model->common_public->states.failed_action_set;
+      surf_cpu_model->common_public.states.failed_action_set;
 
   xbt_swag_insert(action, action->generic_action.state_set);
 
@@ -400,14 +395,11 @@ static void finalize(void)
   xbt_dict_free(&cpu_set);
   lmm_system_free(cpu_maxmin_system);
   cpu_maxmin_system = NULL;
-  xbt_swag_free(surf_cpu_model->common_public->states.ready_action_set);
-  xbt_swag_free(surf_cpu_model->common_public->states.running_action_set);
-  xbt_swag_free(surf_cpu_model->common_public->states.failed_action_set);
-  xbt_swag_free(surf_cpu_model->common_public->states.done_action_set);
+
+  surf_model_exit((surf_model_t) surf_cpu_model);
+
   xbt_swag_free(running_action_set_that_does_not_need_being_checked);
   running_action_set_that_does_not_need_being_checked = NULL;
-  free(surf_cpu_model->common_public);
-  free(surf_cpu_model->common_private);
   free(surf_cpu_model->extension_public);
 
   free(surf_cpu_model);
@@ -420,38 +412,27 @@ static void surf_cpu_model_init_internal(void)
 
   surf_cpu_model = xbt_new0(s_surf_cpu_model_t, 1);
 
-  surf_cpu_model->common_private = xbt_new0(s_surf_model_private_t, 1);
-  surf_cpu_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t) surf_cpu_model);
 
   surf_cpu_model->extension_public =
     xbt_new0(s_surf_cpu_model_extension_public_t, 1);
 
-  surf_cpu_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_cpu_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_cpu_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_cpu_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
   running_action_set_that_does_not_need_being_checked =
     xbt_swag_new(xbt_swag_offset(action, state_hookup));
 
-  surf_cpu_model->common_public->name_service = name_service;
-  surf_cpu_model->common_public->get_resource_name = get_resource_name;
-  surf_cpu_model->common_public->action_get_state = surf_action_get_state;
-  surf_cpu_model->common_public->action_get_start_time =
+  surf_cpu_model->common_public.name_service = name_service;
+  surf_cpu_model->common_public.get_resource_name = get_resource_name;
+  surf_cpu_model->common_public.action_get_state = surf_action_get_state;
+  surf_cpu_model->common_public.action_get_start_time =
     surf_action_get_start_time;
-  surf_cpu_model->common_public->action_get_finish_time =
+  surf_cpu_model->common_public.action_get_finish_time =
     surf_action_get_finish_time;
-  surf_cpu_model->common_public->action_free = action_free;
-  surf_cpu_model->common_public->action_use = action_use;
-  surf_cpu_model->common_public->action_cancel = action_cancel;
-  surf_cpu_model->common_public->action_recycle = action_recycle;
-  surf_cpu_model->common_public->action_change_state = action_change_state;
-  surf_cpu_model->common_public->action_set_data = surf_action_set_data;
-  surf_cpu_model->common_public->name = "CPU";
+  surf_cpu_model->common_public.action_free = action_free;
+  surf_cpu_model->common_public.action_use = action_use;
+  surf_cpu_model->common_public.action_cancel = action_cancel;
+  surf_cpu_model->common_public.action_change_state = action_change_state;
+  surf_cpu_model->common_public.action_set_data = surf_action_set_data;
+  surf_cpu_model->common_public.name = "CPU";
 
   surf_cpu_model->common_private->resource_used = resource_used;
   surf_cpu_model->common_private->share_resources = share_resources;
@@ -460,11 +441,11 @@ static void surf_cpu_model_init_internal(void)
     update_resource_state;
   surf_cpu_model->common_private->finalize = finalize;
 
-  surf_cpu_model->common_public->suspend = action_suspend;
-  surf_cpu_model->common_public->resume = action_resume;
-  surf_cpu_model->common_public->is_suspended = action_is_suspended;
-  surf_cpu_model->common_public->set_max_duration = action_set_max_duration;
-  surf_cpu_model->common_public->set_priority = action_set_priority;
+  surf_cpu_model->common_public.suspend = action_suspend;
+  surf_cpu_model->common_public.resume = action_resume;
+  surf_cpu_model->common_public.is_suspended = action_is_suspended;
+  surf_cpu_model->common_public.set_max_duration = action_set_max_duration;
+  surf_cpu_model->common_public.set_priority = action_set_priority;
   surf_cpu_model->extension_public->execute = execute;
   surf_cpu_model->extension_public->sleep = action_sleep;
 
@@ -472,7 +453,7 @@ static void surf_cpu_model_init_internal(void)
   surf_cpu_model->extension_public->get_speed = get_speed;
   surf_cpu_model->extension_public->get_available_speed = get_available_speed;
   /*manage the properties of the cpu */
-  surf_cpu_model->common_public->get_properties = get_properties;
+  surf_cpu_model->common_public.get_properties = get_properties;
 
   if (!cpu_set)
     cpu_set = xbt_dict_new();
diff --git a/src/surf/model.c b/src/surf/model.c
new file mode 100644 (file)
index 0000000..397dd45
--- /dev/null
@@ -0,0 +1,46 @@
+
+/* Copyright (c) 2009 The SimGrid Team. All rights reserved.                */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_private.h"
+
+static void void_die_impossible_paction(surf_action_t action) {
+       DIE_IMPOSSIBLE;
+}
+static int int_die_impossible_paction(surf_action_t action) {
+       DIE_IMPOSSIBLE;
+}
+
+/** @brief initialize common datastructures to all models */
+void surf_model_init(surf_model_t model) {
+         s_surf_action_t action;
+
+
+         model->common_private = xbt_new0(s_surf_model_private_t, 1);
+
+         model->common_public.states.ready_action_set =
+           xbt_swag_new(xbt_swag_offset(action, state_hookup));
+         model->common_public.states.running_action_set =
+           xbt_swag_new(xbt_swag_offset(action, state_hookup));
+         model->common_public.states.failed_action_set =
+           xbt_swag_new(xbt_swag_offset(action, state_hookup));
+         model->common_public.states.done_action_set =
+           xbt_swag_new(xbt_swag_offset(action, state_hookup));
+
+         model->common_public.action_free = int_die_impossible_paction;
+         model->common_public.action_cancel = void_die_impossible_paction;
+         model->common_public.action_recycle = void_die_impossible_paction;
+
+}
+
+
+/** @brief finalize common datastructures to all models */
+void surf_model_exit(surf_model_t model) {
+         xbt_swag_free(model->common_public.states.ready_action_set);
+         xbt_swag_free(model->common_public.states.running_action_set);
+         xbt_swag_free(model->common_public.states.failed_action_set);
+         xbt_swag_free(model->common_public.states.done_action_set);
+         free(model->common_private);
+}
index 2ed6eef..4856e95 100644 (file)
@@ -365,7 +365,7 @@ static double share_resources(double now)
   s_surf_action_network_CM02_t s_action;
   surf_action_network_CM02_t action = NULL;
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
   double min;
 
   min = generic_maxmin_share_resources(running_actions,
@@ -393,10 +393,10 @@ static void update_actions_state(double now, double delta)
   surf_action_network_CM02_t action = NULL;
   surf_action_network_CM02_t next_action = NULL;
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
   /*
      xbt_swag_t failed_actions =
-     surf_network_model->common_public->states.failed_action_set;
+     surf_network_model->common_public.states.failed_action_set;
    */
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
@@ -547,11 +547,11 @@ static surf_action_t communicate(void *src, void *dst, double size,
   action->suspended = 0;        /* Should be useless because of the
                                    calloc but it seems to help valgrind... */
   action->generic_action.state_set =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
   for (i = 0; i < route_size; i++)
     if (route[i]->state_current == SURF_LINK_OFF) {
       action->generic_action.state_set =
-        surf_network_model->common_public->states.failed_action_set;
+        surf_network_model->common_public.states.failed_action_set;
       break;
     }
 
@@ -682,14 +682,10 @@ static void finalize(void)
 
   xbt_dict_free(&network_card_set);
   xbt_dict_free(&link_set);
-  xbt_swag_free(surf_network_model->common_public->states.ready_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.running_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.failed_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.done_action_set);
-  free(surf_network_model->common_public);
-  free(surf_network_model->common_private);
-  free(surf_network_model->extension_public);
 
+  surf_model_exit((surf_model_t)surf_network_model);
+
+  free(surf_network_model->extension_public);
   free(surf_network_model);
   surf_network_model = NULL;
 
@@ -708,39 +704,28 @@ static void finalize(void)
 
 static void surf_network_model_init_internal(void)
 {
-  s_surf_action_t action;
-
   surf_network_model = xbt_new0(s_surf_network_model_t, 1);
 
-  surf_network_model->common_private = xbt_new0(s_surf_model_private_t, 1);
-  surf_network_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_network_model);
+
   surf_network_model->extension_public =
     xbt_new0(s_surf_network_model_extension_public_t, 1);
 
-  surf_network_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_network_model->common_public->name_service = name_service;
-  surf_network_model->common_public->get_resource_name = get_resource_name;
-  surf_network_model->common_public->action_get_state = surf_action_get_state;
-  surf_network_model->common_public->action_get_start_time =
+  surf_network_model->common_public.name_service = name_service;
+  surf_network_model->common_public.get_resource_name = get_resource_name;
+  surf_network_model->common_public.action_get_state = surf_action_get_state;
+  surf_network_model->common_public.action_get_start_time =
     surf_action_get_start_time;
-  surf_network_model->common_public->action_get_finish_time =
+  surf_network_model->common_public.action_get_finish_time =
     surf_action_get_finish_time;
-  surf_network_model->common_public->action_free = action_free;
-  surf_network_model->common_public->action_use = action_use;
-  surf_network_model->common_public->action_cancel = action_cancel;
-  surf_network_model->common_public->action_recycle = action_recycle;
-  surf_network_model->common_public->action_change_state =
+  surf_network_model->common_public.action_free = action_free;
+  surf_network_model->common_public.action_use = action_use;
+  surf_network_model->common_public.action_cancel = action_cancel;
+  surf_network_model->common_public.action_recycle = action_recycle;
+  surf_network_model->common_public.action_change_state =
     action_change_state;
-  surf_network_model->common_public->action_set_data = surf_action_set_data;
-  surf_network_model->common_public->name = "network";
+  surf_network_model->common_public.action_set_data = surf_action_set_data;
+  surf_network_model->common_public.name = "network";
 
   surf_network_model->common_private->resource_used = resource_used;
   surf_network_model->common_private->share_resources = share_resources;
@@ -750,10 +735,10 @@ static void surf_network_model_init_internal(void)
     update_resource_state;
   surf_network_model->common_private->finalize = finalize;
 
-  surf_network_model->common_public->suspend = action_suspend;
-  surf_network_model->common_public->resume = action_resume;
-  surf_network_model->common_public->is_suspended = action_is_suspended;
-  surf_cpu_model->common_public->set_max_duration = action_set_max_duration;
+  surf_network_model->common_public.suspend = action_suspend;
+  surf_network_model->common_public.resume = action_resume;
+  surf_network_model->common_public.is_suspended = action_is_suspended;
+  surf_cpu_model->common_public.set_max_duration = action_set_max_duration;
 
   surf_network_model->extension_public->communicate = communicate;
   surf_network_model->extension_public->get_route = get_route;
@@ -764,7 +749,7 @@ static void surf_network_model_init_internal(void)
   surf_network_model->extension_public->get_link_latency = get_link_latency;
   surf_network_model->extension_public->link_shared = link_shared;
 
-  surf_network_model->common_public->get_properties = get_properties;
+  surf_network_model->common_public.get_properties = get_properties;
 
   link_set = xbt_dict_new();
   network_card_set = xbt_dict_new();
index 1561796..557e94a 100644 (file)
@@ -138,7 +138,7 @@ static double share_resources(double now)
 {
   surf_action_network_Constant_t action = NULL;
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
   double min = -1.0;
 
   xbt_swag_foreach(action, running_actions) {
@@ -158,7 +158,7 @@ static void update_actions_state(double now, double delta)
   surf_action_network_Constant_t action = NULL;
   surf_action_network_Constant_t next_action = NULL;
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
     if (action->latency > 0) {
@@ -218,10 +218,10 @@ static surf_action_t communicate(void *src, void *dst, double size,
 
   if (action->latency <= 0.0)
     action->generic_action.state_set =
-      surf_network_model->common_public->states.done_action_set;
+      surf_network_model->common_public.states.done_action_set;
   else
     action->generic_action.state_set =
-      surf_network_model->common_public->states.running_action_set;
+      surf_network_model->common_public.states.running_action_set;
 
   xbt_swag_insert(action, action->generic_action.state_set);
 
@@ -293,12 +293,9 @@ static void action_set_max_duration(surf_action_t action, double duration)
 static void finalize(void)
 {
   xbt_dict_free(&network_card_set);
-  xbt_swag_free(surf_network_model->common_public->states.ready_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.running_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.failed_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.done_action_set);
-  free(surf_network_model->common_public);
-  free(surf_network_model->common_private);
+
+  surf_model_exit((surf_model_t)surf_network_model);
+
   free(surf_network_model->extension_public);
 
   free(surf_network_model);
@@ -309,39 +306,28 @@ static void finalize(void)
 
 static void surf_network_model_init_internal(void)
 {
-  s_surf_action_t action;
-
   surf_network_model = xbt_new0(s_surf_network_model_t, 1);
 
-  surf_network_model->common_private = xbt_new0(s_surf_model_private_t, 1);
-  surf_network_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_network_model);
+
   surf_network_model->extension_public =
     xbt_new0(s_surf_network_model_extension_public_t, 1);
 
-  surf_network_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_network_model->common_public->name_service = name_service;
-  surf_network_model->common_public->get_resource_name = get_resource_name;
-  surf_network_model->common_public->action_get_state = surf_action_get_state;
-  surf_network_model->common_public->action_get_start_time =
+  surf_network_model->common_public.name_service = name_service;
+  surf_network_model->common_public.get_resource_name = get_resource_name;
+  surf_network_model->common_public.action_get_state = surf_action_get_state;
+  surf_network_model->common_public.action_get_start_time =
     surf_action_get_start_time;
-  surf_network_model->common_public->action_get_finish_time =
+  surf_network_model->common_public.action_get_finish_time =
     surf_action_get_finish_time;
-  surf_network_model->common_public->action_free = action_free;
-  surf_network_model->common_public->action_use = action_use;
-  surf_network_model->common_public->action_cancel = action_cancel;
-  surf_network_model->common_public->action_recycle = action_recycle;
-  surf_network_model->common_public->action_change_state =
+  surf_network_model->common_public.action_free = action_free;
+  surf_network_model->common_public.action_use = action_use;
+  surf_network_model->common_public.action_cancel = action_cancel;
+  surf_network_model->common_public.action_recycle = action_recycle;
+  surf_network_model->common_public.action_change_state =
     action_change_state;
-  surf_network_model->common_public->action_set_data = surf_action_set_data;
-  surf_network_model->common_public->name = "network";
+  surf_network_model->common_public.action_set_data = surf_action_set_data;
+  surf_network_model->common_public.name = "network";
 
   surf_network_model->common_private->resource_used = resource_used;
   surf_network_model->common_private->share_resources = share_resources;
@@ -351,10 +337,10 @@ static void surf_network_model_init_internal(void)
     update_resource_state;
   surf_network_model->common_private->finalize = finalize;
 
-  surf_network_model->common_public->suspend = action_suspend;
-  surf_network_model->common_public->resume = action_resume;
-  surf_network_model->common_public->is_suspended = action_is_suspended;
-  surf_cpu_model->common_public->set_max_duration = action_set_max_duration;
+  surf_network_model->common_public.suspend = action_suspend;
+  surf_network_model->common_public.resume = action_resume;
+  surf_network_model->common_public.is_suspended = action_is_suspended;
+  surf_cpu_model->common_public.set_max_duration = action_set_max_duration;
 
   surf_network_model->extension_public->communicate = communicate;
   surf_network_model->extension_public->get_route = get_route;
@@ -365,7 +351,7 @@ static void surf_network_model_init_internal(void)
   surf_network_model->extension_public->get_link_latency = get_link_latency;
   surf_network_model->extension_public->link_shared = link_shared;
 
-  surf_network_model->common_public->get_properties = get_properties;
+  surf_network_model->common_public.get_properties = get_properties;
 
   network_card_set = xbt_dict_new();
 
index 6fc36a3..2c747b2 100644 (file)
@@ -376,7 +376,7 @@ static void action_change_state(surf_action_t action,
 static double share_resources(double now)
 {
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
 
   //get the first relevant value from the running_actions list
   if (!xbt_swag_size(running_actions))
@@ -392,7 +392,7 @@ static double share_resources(double now)
 
 /* delta: by how many time units the simulation must advance */
 /* In this function: change the state of actions that terminate */
-/* The delta may not come from the network, and thus may be different (smaller) 
+/* The delta may not come from the network, and thus may be different (smaller)
    than the one returned by the function above */
 /* If the delta is a network-caused min, then do not emulate any timer in the
    network simulation, otherwise fake a timer somehow to advance the simulation of min seconds */
@@ -402,7 +402,7 @@ static void update_actions_state(double now, double delta)
   surf_action_network_GTNETS_t action = NULL;
   //  surf_action_network_GTNETS_t next_action = NULL;
   xbt_swag_t running_actions =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
 
   /* If there are no renning flows, just return */
   if (time_to_next_flow_completion < 0.0) {
@@ -495,7 +495,7 @@ static surf_action_t communicate(void *src, void *dst, double size,
   action->generic_action.model_type = (surf_model_t) surf_network_model;
 
   action->generic_action.state_set =
-    surf_network_model->common_public->states.running_action_set;
+    surf_network_model->common_public.states.running_action_set;
 
   xbt_swag_insert(action, action->generic_action.state_set);
 
@@ -531,17 +531,11 @@ static int action_is_suspended(surf_action_t action)
 
 static void finalize(void)
 {
-#if 0
-  int i, j;
-#endif
   xbt_dict_free(&network_card_set);
   xbt_dict_free(&link_set);
-  xbt_swag_free(surf_network_model->common_public->states.ready_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.running_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.failed_action_set);
-  xbt_swag_free(surf_network_model->common_public->states.done_action_set);
-  free(surf_network_model->common_public);
-  free(surf_network_model->common_private);
+
+  surf_model_exit((surf_model_t)surf_network_model);
+
   free(surf_network_model->extension_public);
 
   free(surf_network_model);
@@ -556,31 +550,22 @@ static void surf_network_model_init_internal(void)
 
   surf_network_model = xbt_new0(s_surf_network_model_t, 1);
 
-  surf_network_model->common_private = xbt_new0(s_surf_model_private_t, 1);
-  surf_network_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_network_model);
+
   surf_network_model->extension_public =
     xbt_new0(s_surf_network_model_extension_public_t, 1);
 
-  surf_network_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_network_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_network_model->common_public->name_service = name_service;
-  surf_network_model->common_public->get_resource_name = get_resource_name;
-  surf_network_model->common_public->action_get_state = surf_action_get_state;
-  surf_network_model->common_public->action_use = action_use;
-  surf_network_model->common_public->action_free = action_free;
-  surf_network_model->common_public->action_cancel = action_cancel;
-  surf_network_model->common_public->action_recycle = action_recycle;
-  surf_network_model->common_public->action_change_state =
+  surf_network_model->common_public.name_service = name_service;
+  surf_network_model->common_public.get_resource_name = get_resource_name;
+  surf_network_model->common_public.action_get_state = surf_action_get_state;
+  surf_network_model->common_public.action_use = action_use;
+  surf_network_model->common_public.action_free = action_free;
+  surf_network_model->common_public.action_cancel = action_cancel;
+  surf_network_model->common_public.action_recycle = action_recycle;
+  surf_network_model->common_public.action_change_state =
     action_change_state;
-  surf_network_model->common_public->action_set_data = surf_action_set_data;
-  surf_network_model->common_public->name = "network";
+  surf_network_model->common_public.action_set_data = surf_action_set_data;
+  surf_network_model->common_public.name = "network";
 
   surf_network_model->common_private->resource_used = resource_used;
   surf_network_model->common_private->share_resources = share_resources;
@@ -590,14 +575,14 @@ static void surf_network_model_init_internal(void)
     update_resource_state;
   surf_network_model->common_private->finalize = finalize;
 
-  surf_network_model->common_public->suspend = action_suspend;
-  surf_network_model->common_public->resume = action_resume;
-  surf_network_model->common_public->is_suspended = action_is_suspended;
+  surf_network_model->common_public.suspend = action_suspend;
+  surf_network_model->common_public.resume = action_resume;
+  surf_network_model->common_public.is_suspended = action_is_suspended;
 
   surf_network_model->extension_public->communicate = communicate;
 
   /*for the props of the link */
-  surf_network_model->common_public->get_properties = get_properties;
+  surf_network_model->common_public.get_properties = get_properties;
 
   link_set = xbt_dict_new();
   network_card_set = xbt_dict_new();
index a4e1d75..1690162 100644 (file)
@@ -243,7 +243,7 @@ double generic_maxmin_share_resources(xbt_swag_t running_actions,
 e_surf_action_state_t surf_action_get_state(surf_action_t action)
 {
   surf_action_state_t action_state =
-    &(action->model_type->common_public->states);
+    &(action->model_type->common_public.states);
 
   if (action->state_set == action_state->ready_action_set)
     return SURF_ACTION_READY;
@@ -268,7 +268,7 @@ double surf_action_get_finish_time(surf_action_t action)
 
 void surf_action_free(surf_action_t * action)
 {
-  (*action)->model_type->common_public->action_cancel(*action);
+  (*action)->model_type->common_public.action_cancel(*action);
   free(*action);
   *action = NULL;
 }
@@ -277,7 +277,7 @@ void surf_action_change_state(surf_action_t action,
                               e_surf_action_state_t state)
 {
   surf_action_state_t action_state =
-    &(action->model_type->common_public->states);
+    &(action->model_type->common_public.states);
   XBT_IN2("(%p,%s)", action, surf_action_state_names[state]);
   xbt_swag_remove(action, action->state_set);
 
@@ -473,10 +473,10 @@ double surf_solve(void)
 
   DEBUG0("Looking for next action end");
   xbt_dynar_foreach(model_list, iter, model) {
-    DEBUG1("Running for Resource [%s]", model->common_public->name);
+    DEBUG1("Running for Resource [%s]", model->common_public.name);
     model_next_action_end = model->common_private->share_resources(NOW);
     DEBUG2("Resource [%s] : next action end = %f",
-           model->common_public->name, model_next_action_end);
+           model->common_public.name, model_next_action_end);
     if (((min < 0.0) || (model_next_action_end < min))
         && (model_next_action_end >= 0.0))
       min = model_next_action_end;
index 2c53b22..af323a9 100644 (file)
@@ -32,7 +32,7 @@ typedef enum {
 
 typedef struct surf_model_private {
   int (*resource_used) (void *resource_id);
-  /* Share the resources to the actions and return in hom much time
+  /* Share the resources to the actions and return in how much time
      the next action may terminate */
   double (*share_resources) (double now);
   /* Update the actions' state */
@@ -53,7 +53,7 @@ double generic_maxmin_share_resources(xbt_swag_t running_actions,
                                       lmm_system_t sys,
                                       void (*solve) (lmm_system_t));
 
-/* Generic functions common to all modelss */
+/* Generic functions common to all models */
 e_surf_action_state_t surf_action_get_state(surf_action_t action);
 double surf_action_get_start_time(surf_action_t action);
 double surf_action_get_finish_time(surf_action_t action);
index 79d9193..7e70ea8 100644 (file)
@@ -70,24 +70,6 @@ static int resource_used(void *resource_id)
   return 1;
 }
 
-static int action_free(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return 1;
-}
-
-static void action_cancel(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return;
-}
-
-static void action_recycle(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return;
-}
-
 static void action_change_state(surf_action_t action,
                                 e_surf_action_state_t state)
 {
@@ -178,12 +160,8 @@ static void finalize(void)
   xbt_swag_free(command_pending);
   xbt_swag_free(command_to_run);
 
-  xbt_swag_free(surf_timer_model->common_public->states.ready_action_set);
-  xbt_swag_free(surf_timer_model->common_public->states.running_action_set);
-  xbt_swag_free(surf_timer_model->common_public->states.failed_action_set);
-  xbt_swag_free(surf_timer_model->common_public->states.done_action_set);
-  free(surf_timer_model->common_public);
-  free(surf_timer_model->common_private);
+  surf_model_exit((surf_model_t)surf_timer_model);
+
   free(surf_timer_model->extension_public);
 
   free(surf_timer_model);
@@ -192,34 +170,19 @@ static void finalize(void)
 
 static void surf_timer_model_init_internal(void)
 {
-  s_surf_action_t action;
-
   surf_timer_model = xbt_new0(s_surf_timer_model_t, 1);
 
-  surf_timer_model->common_private = xbt_new0(s_surf_model_private_t, 1);
-  surf_timer_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_timer_model);
 
   surf_timer_model->extension_public =
     xbt_new0(s_surf_timer_model_extension_public_t, 1);
 
-  surf_timer_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_timer_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_timer_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_timer_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_timer_model->common_public->name_service = name_service;
-  surf_timer_model->common_public->get_resource_name = get_resource_name;
-  surf_timer_model->common_public->action_get_state = surf_action_get_state;
-  surf_timer_model->common_public->action_free = action_free;
-  surf_timer_model->common_public->action_cancel = action_cancel;
-  surf_timer_model->common_public->action_recycle = action_recycle;
-  surf_timer_model->common_public->action_change_state = action_change_state;
-  surf_timer_model->common_public->action_set_data = surf_action_set_data;
-  surf_timer_model->common_public->name = "TIMER";
+  surf_timer_model->common_public.name_service = name_service;
+  surf_timer_model->common_public.get_resource_name = get_resource_name;
+  surf_timer_model->common_public.action_get_state = surf_action_get_state;
+  surf_timer_model->common_public.action_change_state = action_change_state;
+  surf_timer_model->common_public.action_set_data = surf_action_set_data;
+  surf_timer_model->common_public.name = "TIMER";
 
   surf_timer_model->common_private->resource_used = resource_used;
   surf_timer_model->common_private->share_resources = share_resources;
@@ -229,9 +192,9 @@ static void surf_timer_model_init_internal(void)
     update_resource_state;
   surf_timer_model->common_private->finalize = finalize;
 
-  surf_timer_model->common_public->suspend = action_suspend;
-  surf_timer_model->common_public->resume = action_resume;
-  surf_timer_model->common_public->is_suspended = action_is_suspended;
+  surf_timer_model->common_public.suspend = action_suspend;
+  surf_timer_model->common_public.resume = action_resume;
+  surf_timer_model->common_public.is_suspended = action_is_suspended;
 
   surf_timer_model->extension_public->set = set;
   surf_timer_model->extension_public->get = get;
index b94c527..33d8943 100644 (file)
@@ -86,9 +86,9 @@ static void parallel_action_use(surf_action_t action)
 static int action_free(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    return surf_network_model->common_public->action_free(action);
+    return surf_network_model->common_public.action_free(action);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    return surf_cpu_model->common_public->action_free(action);
+    return surf_cpu_model->common_public.action_free(action);
   else if (action->model_type == (surf_model_t) surf_workstation_model)
     return parallel_action_free(action);
   else
@@ -99,9 +99,9 @@ static int action_free(surf_action_t action)
 static void action_use(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->action_use(action);
+    surf_network_model->common_public.action_use(action);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->action_use(action);
+    surf_cpu_model->common_public.action_use(action);
   else if (action->model_type == (surf_model_t) surf_workstation_model)
     parallel_action_use(action);
   else
@@ -112,9 +112,9 @@ static void action_use(surf_action_t action)
 static void action_cancel(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->action_cancel(action);
+    surf_network_model->common_public.action_cancel(action);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->action_cancel(action);
+    surf_cpu_model->common_public.action_cancel(action);
   else if (action->model_type == (surf_model_t) surf_workstation_model)
     parallel_action_cancel(action);
   else
@@ -122,19 +122,13 @@ static void action_cancel(surf_action_t action)
   return;
 }
 
-static void action_recycle(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return;
-}
-
 static void action_change_state(surf_action_t action,
                                 e_surf_action_state_t state)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->action_change_state(action, state);
+    surf_network_model->common_public.action_change_state(action, state);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->action_change_state(action, state);
+    surf_cpu_model->common_public.action_change_state(action, state);
   else if (action->model_type == (surf_model_t) surf_workstation_model)
     surf_action_change_state(action, state);
   else
@@ -175,9 +169,9 @@ static surf_action_t action_sleep(void *workstation, double duration)
 static void action_suspend(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->suspend(action);
+    surf_network_model->common_public.suspend(action);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->suspend(action);
+    surf_cpu_model->common_public.suspend(action);
   else
     DIE_IMPOSSIBLE;
 }
@@ -185,9 +179,9 @@ static void action_suspend(surf_action_t action)
 static void action_resume(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->resume(action);
+    surf_network_model->common_public.resume(action);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->resume(action);
+    surf_cpu_model->common_public.resume(action);
   else
     DIE_IMPOSSIBLE;
 }
@@ -195,18 +189,18 @@ static void action_resume(surf_action_t action)
 static int action_is_suspended(surf_action_t action)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    return surf_network_model->common_public->is_suspended(action);
+    return surf_network_model->common_public.is_suspended(action);
   if (action->model_type == (surf_model_t) surf_cpu_model)
-    return surf_cpu_model->common_public->is_suspended(action);
+    return surf_cpu_model->common_public.is_suspended(action);
   DIE_IMPOSSIBLE;
 }
 
 static void action_set_max_duration(surf_action_t action, double duration)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->set_max_duration(action, duration);
+    surf_network_model->common_public.set_max_duration(action, duration);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->set_max_duration(action, duration);
+    surf_cpu_model->common_public.set_max_duration(action, duration);
   else
     DIE_IMPOSSIBLE;
 }
@@ -214,9 +208,9 @@ static void action_set_max_duration(surf_action_t action, double duration)
 static void action_set_priority(surf_action_t action, double priority)
 {
   if (action->model_type == (surf_model_t) surf_network_model)
-    surf_network_model->common_public->set_priority(action, priority);
+    surf_network_model->common_public.set_priority(action, priority);
   else if (action->model_type == (surf_model_t) surf_cpu_model)
-    surf_cpu_model->common_public->set_priority(action, priority);
+    surf_cpu_model->common_public.set_priority(action, priority);
   else
     DIE_IMPOSSIBLE;
 }
@@ -255,7 +249,7 @@ static double get_available_speed(void *workstation)
 static xbt_dict_t get_properties(void *workstation)
 {
   return surf_cpu_model->
-    common_public->get_properties(((workstation_CLM03_t) workstation)->cpu);
+    common_public.get_properties(((workstation_CLM03_t) workstation)->cpu);
 }
 
 static surf_action_t execute_parallel_task(int workstation_nb,
@@ -311,17 +305,9 @@ static int link_shared(const void *link)
 static void finalize(void)
 {
   xbt_dict_free(&workstation_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.ready_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.running_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.failed_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.done_action_set);
-
-  free(surf_workstation_model->common_public);
-  free(surf_workstation_model->common_private);
+
+  surf_model_exit((surf_model_t)surf_workstation_model);
+
   free(surf_workstation_model->extension_public);
 
   free(surf_workstation_model);
@@ -330,44 +316,30 @@ static void finalize(void)
 
 static void surf_workstation_model_init_internal(void)
 {
-  s_surf_action_t action;
-
   surf_workstation_model = xbt_new0(s_surf_workstation_model_t, 1);
 
-  surf_workstation_model->common_private =
-    xbt_new0(s_surf_model_private_t, 1);
-  surf_workstation_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_workstation_model);
 /*   surf_workstation_model->extension_private = xbt_new0(s_surf_workstation_model_extension_private_t,1); */
   surf_workstation_model->extension_public =
     xbt_new0(s_surf_workstation_model_extension_public_t, 1);
 
-  surf_workstation_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_workstation_model->common_public->name_service = name_service;
-  surf_workstation_model->common_public->get_resource_name =
+  surf_workstation_model->common_public.name_service = name_service;
+  surf_workstation_model->common_public.get_resource_name =
     get_resource_name;
-  surf_workstation_model->common_public->action_get_state =
+  surf_workstation_model->common_public.action_get_state =
     surf_action_get_state;
-  surf_workstation_model->common_public->action_get_start_time =
+  surf_workstation_model->common_public.action_get_start_time =
     surf_action_get_start_time;
-  surf_workstation_model->common_public->action_get_finish_time =
+  surf_workstation_model->common_public.action_get_finish_time =
     surf_action_get_finish_time;
-  surf_workstation_model->common_public->action_free = action_free;
-  surf_workstation_model->common_public->action_use = action_use;
-  surf_workstation_model->common_public->action_cancel = action_cancel;
-  surf_workstation_model->common_public->action_recycle = action_recycle;
-  surf_workstation_model->common_public->action_change_state =
+  surf_workstation_model->common_public.action_free = action_free;
+  surf_workstation_model->common_public.action_use = action_use;
+  surf_workstation_model->common_public.action_cancel = action_cancel;
+  surf_workstation_model->common_public.action_change_state =
     action_change_state;
-  surf_workstation_model->common_public->action_set_data =
+  surf_workstation_model->common_public.action_set_data =
     surf_action_set_data;
-  surf_workstation_model->common_public->name = "Workstation";
+  surf_workstation_model->common_public.name = "Workstation";
 
   surf_workstation_model->common_private->resource_used = resource_used;
   surf_workstation_model->common_private->share_resources = share_resources;
@@ -377,12 +349,12 @@ static void surf_workstation_model_init_internal(void)
     update_resource_state;
   surf_workstation_model->common_private->finalize = finalize;
 
-  surf_workstation_model->common_public->suspend = action_suspend;
-  surf_workstation_model->common_public->resume = action_resume;
-  surf_workstation_model->common_public->is_suspended = action_is_suspended;
-  surf_workstation_model->common_public->set_max_duration =
+  surf_workstation_model->common_public.suspend = action_suspend;
+  surf_workstation_model->common_public.resume = action_resume;
+  surf_workstation_model->common_public.is_suspended = action_is_suspended;
+  surf_workstation_model->common_public.set_max_duration =
     action_set_max_duration;
-  surf_workstation_model->common_public->set_priority = action_set_priority;
+  surf_workstation_model->common_public.set_priority = action_set_priority;
 
   surf_workstation_model->extension_public->execute = execute;
   surf_workstation_model->extension_public->sleep = action_sleep;
@@ -392,7 +364,7 @@ static void surf_workstation_model_init_internal(void)
     get_available_speed;
 
   /*manage the properties of the workstation */
-  surf_workstation_model->common_public->get_properties = get_properties;
+  surf_workstation_model->common_public.get_properties = get_properties;
 
   surf_workstation_model->extension_public->communicate = communicate;
   surf_workstation_model->extension_public->execute_parallel_task =
index aeecdd6..063d56e 100644 (file)
@@ -176,12 +176,6 @@ static void action_cancel(surf_action_t action)
   return;
 }
 
-static void action_recycle(surf_action_t action)
-{
-  DIE_IMPOSSIBLE;
-  return;
-}
-
 /* action_change_state is inherited from the surf module */
 /* action_set_data is inherited from the surf module */
 
@@ -248,7 +242,7 @@ static double share_resources(double now)
   surf_action_workstation_L07_t action = NULL;
 
   xbt_swag_t running_actions =
-    surf_workstation_model->common_public->states.running_action_set;
+    surf_workstation_model->common_public.states.running_action_set;
   double min = generic_maxmin_share_resources(running_actions,
                                               xbt_swag_offset(s_action,
                                                               variable),
@@ -280,7 +274,7 @@ static void update_actions_state(double now, double delta)
   surf_action_workstation_L07_t action = NULL;
   surf_action_workstation_L07_t next_action = NULL;
   xbt_swag_t running_actions =
-    surf_workstation_model->common_public->states.running_action_set;
+    surf_workstation_model->common_public.states.running_action_set;
 
   xbt_swag_foreach_safe(action, next_action, running_actions) {
     deltap = delta;
@@ -429,17 +423,9 @@ static void finalize(void)
   if (parallel_task_link_set != NULL) {
     xbt_dict_free(&parallel_task_link_set);
   }
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.ready_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.running_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.failed_action_set);
-  xbt_swag_free(surf_workstation_model->common_public->
-                states.done_action_set);
-
-  free(surf_workstation_model->common_public);
-  free(surf_workstation_model->common_private);
+
+  surf_model_exit((surf_model_t)surf_workstation_model);
+
   free(surf_workstation_model->extension_public);
 
   free(surf_workstation_model);
@@ -538,7 +524,7 @@ static surf_action_t execute_parallel_task(int workstation_nb,
   action->communication_amount = communication_amount;
   action->latency = latency;
   action->generic_action.state_set =
-    surf_workstation_model->common_public->states.running_action_set;
+    surf_workstation_model->common_public.states.running_action_set;
 
   xbt_swag_insert(action, action->generic_action.state_set);
   action->rate = rate;
@@ -1049,49 +1035,35 @@ static void define_callbacks(const char *file)
 
 static void model_init_internal(void)
 {
-  s_surf_action_t action;
-
   surf_workstation_model = xbt_new0(s_surf_workstation_model_t, 1);
 
-  surf_workstation_model->common_private =
-    xbt_new0(s_surf_model_private_t, 1);
-  surf_workstation_model->common_public = xbt_new0(s_surf_model_public_t, 1);
+  surf_model_init((surf_model_t)surf_workstation_model);
   surf_workstation_model->extension_public =
     xbt_new0(s_surf_workstation_model_extension_public_t, 1);
 
-  surf_workstation_model->common_public->states.ready_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.running_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.failed_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-  surf_workstation_model->common_public->states.done_action_set =
-    xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
-  surf_workstation_model->common_public->name_service = name_service;
-  surf_workstation_model->common_public->get_resource_name =
+  surf_workstation_model->common_public.name_service = name_service;
+  surf_workstation_model->common_public.get_resource_name =
     get_resource_name;
-  surf_workstation_model->common_public->action_get_state =
+  surf_workstation_model->common_public.action_get_state =
     surf_action_get_state;
-  surf_workstation_model->common_public->action_get_start_time =
+  surf_workstation_model->common_public.action_get_start_time =
     surf_action_get_start_time;
-  surf_workstation_model->common_public->action_get_finish_time =
+  surf_workstation_model->common_public.action_get_finish_time =
     surf_action_get_finish_time;
-  surf_workstation_model->common_public->action_use = action_use;
-  surf_workstation_model->common_public->action_free = action_free;
-  surf_workstation_model->common_public->action_cancel = action_cancel;
-  surf_workstation_model->common_public->action_recycle = action_recycle;
-  surf_workstation_model->common_public->action_change_state =
+  surf_workstation_model->common_public.action_use = action_use;
+  surf_workstation_model->common_public.action_free = action_free;
+  surf_workstation_model->common_public.action_cancel = action_cancel;
+  surf_workstation_model->common_public.action_change_state =
     surf_action_change_state;
-  surf_workstation_model->common_public->action_set_data =
+  surf_workstation_model->common_public.action_set_data =
     surf_action_set_data;
-  surf_workstation_model->common_public->suspend = action_suspend;
-  surf_workstation_model->common_public->resume = action_resume;
-  surf_workstation_model->common_public->is_suspended = action_is_suspended;
-  surf_workstation_model->common_public->set_max_duration =
+  surf_workstation_model->common_public.suspend = action_suspend;
+  surf_workstation_model->common_public.resume = action_resume;
+  surf_workstation_model->common_public.is_suspended = action_is_suspended;
+  surf_workstation_model->common_public.set_max_duration =
     action_set_max_duration;
-  surf_workstation_model->common_public->set_priority = action_set_priority;
-  surf_workstation_model->common_public->name = "Workstation ptask_L07";
+  surf_workstation_model->common_public.set_priority = action_set_priority;
+  surf_workstation_model->common_public.name = "Workstation ptask_L07";
 
   surf_workstation_model->common_private->resource_used = resource_used;
   surf_workstation_model->common_private->share_resources = share_resources;
@@ -1119,7 +1091,7 @@ static void model_init_internal(void)
     get_link_latency;
   surf_workstation_model->extension_public->link_shared = link_shared;
 
-  surf_workstation_model->common_public->get_properties = get_properties;
+  surf_workstation_model->common_public.get_properties = get_properties;
 
   workstation_set = xbt_dict_new();
   link_set = xbt_dict_new();