]> AND Public Git Repository - simgrid.git/blobdiff - src/smpi/smpi_base.c
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
apparently we can't just pop items off the cond_list for each action any more.
[simgrid.git] / src / smpi / smpi_base.c
index 1972895d0ddfbc3970995cc82b9c35220c1a6fa5..ad53360abb47bc9852c71dc6cfa99e108154c28e 100644 (file)
@@ -119,10 +119,9 @@ int smpi_sender(int argc, char **argv)
                        communicate_action = SIMIX_action_communicate(shost, dhost,
                                NULL, request->datatype->size * request->count * 1.0, -1.0);
 
-                       SIMIX_register_condition_to_action(communicate_action, request->cond);
                        SIMIX_register_action_to_condition(communicate_action, request->cond);
-
                        SIMIX_cond_wait(request->cond, request->mutex);
+                       //SIMIX_unregister_action_to_condition(communicate_action, request->cond);
 
                        SIMIX_mutex_unlock(request->mutex);
 
@@ -415,6 +414,7 @@ void smpi_global_destroy()
 
 int smpi_run_simulation(int argc, char **argv)
 {
+       xbt_fifo_item_t cond_item   = NULL;
        smx_cond_t   cond           = NULL;
        smx_action_t action         = NULL;
 
@@ -448,15 +448,17 @@ int smpi_run_simulation(int argc, char **argv)
        while (SIMIX_solve(actions_done, actions_failed) != -1.0) {
                while ((action = xbt_fifo_pop(actions_failed))) {
                        DEBUG1("** %s failed **", action->name);
-                       while ((cond = xbt_fifo_pop(action->cond_list))) {
+                       xbt_fifo_foreach(action->cond_list, cond_item, cond, smx_cond_t) {
                                SIMIX_cond_broadcast(cond);
+                               SIMIX_unregister_action_to_condition(action, cond);
                        }
                        SIMIX_action_destroy(action);
                }
                while ((action = xbt_fifo_pop(actions_done))) {
                        DEBUG1("** %s done **",action->name);
-                       while ((cond = xbt_fifo_pop(action->cond_list))) {
+                       xbt_fifo_foreach(action->cond_list, cond_item, cond, smx_cond_t) {
                                SIMIX_cond_broadcast(cond);
+                               SIMIX_unregister_action_to_condition(action, cond);
                        }
                        SIMIX_action_destroy(action);
                }
@@ -638,10 +640,10 @@ void smpi_bench_end()
        mutex          = SIMIX_mutex_init();
        cond           = SIMIX_cond_init();
 
-       SIMIX_register_condition_to_action(compute_action, cond);
-       SIMIX_register_action_to_condition(compute_action, cond);
        SIMIX_mutex_lock(mutex);
+       SIMIX_register_action_to_condition(compute_action, cond);
        SIMIX_cond_wait(cond, mutex);
+       //SIMIX_unregister_action_to_condition(compute_action, cond);
        SIMIX_mutex_unlock(mutex);
 
        SIMIX_mutex_destroy(mutex);
@@ -790,10 +792,10 @@ unsigned int smpi_sleep(unsigned int seconds)
        mutex        = SIMIX_mutex_init();
        cond         = SIMIX_cond_init();
 
-       SIMIX_register_condition_to_action(sleep_action, cond);
-       SIMIX_register_action_to_condition(sleep_action, cond);
        SIMIX_mutex_lock(mutex);
+       SIMIX_register_action_to_condition(sleep_action, cond);
        SIMIX_cond_wait(cond, mutex);
+       //SIMIX_unregister_action_to_condition(sleep_action, cond);
        SIMIX_mutex_unlock(mutex);
 
        SIMIX_mutex_destroy(mutex);