Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
msg_simix alpha. All functions implemented.
[simgrid.git] / src / simix / smx_global.c
index 7335b59..3a46a49 100644 (file)
@@ -46,12 +46,14 @@ void SIMIX_global_init(int *argc, char **argv)
 
                simix_global = xbt_new0(s_SIMIX_Global_t,1);
 
-               xbt_context_init();
                simix_global->host = xbt_fifo_new();
                simix_global->process_to_run = xbt_swag_new(xbt_swag_offset(proc,synchro_hookup));
                simix_global->process_list = xbt_swag_new(xbt_swag_offset(proc,process_hookup));
                simix_global->current_process = NULL;
                simix_global->registered_functions = xbt_dict_new();
+
+               simix_global->create_process_function = NULL;
+               simix_global->kill_process_function = NULL;
        }
 }
 
@@ -68,7 +70,7 @@ void __SIMIX_display_process_status(void)
    /*  List the process and their state */
    INFO0("SIMIX: <process> on <host>: <status>.");
    xbt_swag_foreach(process, simix_global->process_list) {
-      simdata_process_t p_simdata = (simdata_process_t) process->simdata;
+      smx_simdata_process_t p_simdata = (smx_simdata_process_t) process->simdata;
      // simdata_host_t h_simdata=(simdata_host_t)p_simdata->host->simdata;
       char *who;
        
@@ -130,14 +132,14 @@ void __SIMIX_main(void)
                        xbt_fifo_item_t _cursor;
 
                        DEBUG1("** %s failed **",smx_action->name);
-                       xbt_fifo_foreach(smx_action->simdata->cond_list,_cursor,cond,smx_cond_t) {
+                       xbt_fifo_foreach(smx_action->cond_list,_cursor,cond,smx_cond_t) {
                                xbt_swag_foreach(process,cond->sleeping) {
                                        DEBUG2("\t preparing to wake up %s on %s",           
                                                        process->name,  process->simdata->host->name);
                                }
                                SIMIX_cond_broadcast(cond);
                                /* remove conditional from action */
-                               xbt_fifo_remove(smx_action->simdata->cond_list,cond);
+                               xbt_fifo_remove(smx_action->cond_list,cond);
                        }
                }
 
@@ -145,14 +147,14 @@ void __SIMIX_main(void)
                        xbt_fifo_item_t _cursor;
 
                        DEBUG1("** %s done **",smx_action->name);
-                       xbt_fifo_foreach(smx_action->simdata->cond_list,_cursor,cond,smx_cond_t) {
+                       xbt_fifo_foreach(smx_action->cond_list,_cursor,cond,smx_cond_t) {
                                xbt_swag_foreach(process,cond->sleeping) {
                                        DEBUG2("\t preparing to wake up %s on %s",           
                                                        process->name,  process->simdata->host->name);
                                }
                                SIMIX_cond_broadcast(cond);
                                /* remove conditional from action */
-                               xbt_fifo_remove(smx_action->simdata->cond_list,cond);
+                               xbt_fifo_remove(smx_action->cond_list,cond);
                        }
                }
        }
@@ -197,7 +199,6 @@ void SIMIX_clean(void)
   while((p=xbt_swag_extract(simix_global->process_list))) {
     SIMIX_process_kill(p);
   }
-  xbt_context_exit();
 
   xbt_fifo_foreach(simix_global->host,i,h,smx_host_t) {
     __SIMIX_host_destroy(h);
@@ -228,16 +229,17 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
        smx_process_t process = NULL;
        int i;
        double elapsed_time = 0.0;
-       int state_modifications = 0;
-
-
-       //surf_solve(); /* Takes traces into account. Returns 0.0  I don't know what to do with this*/
+       static int state_modifications = 1;
+       static int first = 1;
 
        xbt_context_empty_trash();
        if(xbt_swag_size(simix_global->process_to_run) && (elapsed_time>0)) {
                DEBUG0("**************************************************");
        }
-
+       if (first) {
+               surf_solve();/* Takes traces into account. Returns 0.0 */
+               first=0;
+       }
        while ((process = xbt_swag_extract(simix_global->process_to_run))) {
                DEBUG2("Scheduling %s on %s",        
                                process->name,
@@ -258,8 +260,9 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
 
                xbt_dynar_foreach(resource_list, i, resource) {
                        if(xbt_swag_size(resource->common_public->states.failed_action_set) ||
-                                       xbt_swag_size(resource->common_public->states.done_action_set))
+                                       xbt_swag_size(resource->common_public->states.done_action_set)) {
                                state_modifications = 1;
+                               }
                }
 
                if(!state_modifications) {
@@ -272,10 +275,10 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
                        DEBUG2("got %p %p", fun, arg);
                        if(fun==SIMIX_process_create_with_arguments) {
                                process_arg_t args = arg;
-                               DEBUG2("Launching %s on %s", args->name, args->host->name);
+                               DEBUG2("Launching %s on %s", args->name, args->hostname);
                                process = SIMIX_process_create_with_arguments(args->name, args->code, 
-                                               args->data, args->host,
-                                               args->argc,args->argv);
+                                               args->data, args->hostname,
+                                               args->argc,args->argv,NULL);
                                if(args->kill_time > SIMIX_get_clock()) {
                                        surf_timer_resource->extension_public->set(args->kill_time, 
                                                        (void*) &SIMIX_process_kill,
@@ -307,6 +310,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed)
                        }
                }
        }
+       state_modifications = 0;
 
        if (elapsed_time == -1) {
                if (xbt_swag_size(simix_global->process_list) == 0) {
@@ -335,3 +339,23 @@ int SIMIX_timer_get(void **function, void **arg)
 {
        return surf_timer_resource->extension_public->get(function, arg);
 }
+
+
+void SIMIX_function_register_process_create(void * function)
+{
+  xbt_assert0((simix_global->create_process_function == NULL), "Data already set");
+
+  /* Assign create process */
+  simix_global->create_process_function = function;
+
+  return ;
+}
+void SIMIX_function_register_process_kill(void * function)
+{
+  xbt_assert0((simix_global->kill_process_function == NULL), "Data already set");
+
+  /* Assign kill process */
+  simix_global->kill_process_function = function;
+
+  return ;
+}