Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Deployment file generator in Ruby, takes a platform file, parses hostnames and output...
[simgrid.git] / examples / msg / kadeploy / broadcaster.c
index fea16bc..bcc1097 100644 (file)
@@ -14,13 +14,13 @@ xbt_dynar_t build_hostlist_from_hostcount(int hostcount)
     hostname = xbt_new(char, HOSTNAME_LENGTH);
     snprintf(hostname, HOSTNAME_LENGTH, "host%d", i);
     //XBT_INFO("%s", hostname);
-    h = MSG_get_host_by_name(hostname);
+    /*h = MSG_get_host_by_name(hostname);
     if (h == NULL) {
       XBT_INFO("Unknown host %s. Stopping Now! ", hostname);
       abort();
-    } else {
+    } else {*/
       xbt_dynar_push(host_list, &hostname);
-    }
+    /*}*/
   }
   return host_list;
 }
@@ -49,12 +49,11 @@ void delete_hostlist(xbt_dynar_t h)
   xbt_dynar_free(&h);
 }
 
-int broadcaster_build_chain(const char **first, xbt_dynar_t host_list)
+int broadcaster_build_chain(const char **first, xbt_dynar_t host_list, xbt_dynar_iterator_t it)
 {
-  xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
   msg_task_t task = NULL;
   char **cur = (char**)xbt_dynar_iterator_next(it);
-  const char *me = MSG_host_get_name(MSG_host_self());
+  const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
   const char *current_host = NULL;
   const char *prev = NULL;
   const char *next = NULL;
@@ -87,7 +86,6 @@ int broadcaster_build_chain(const char **first, xbt_dynar_t host_list)
       last = current_host;
     } while (cur != NULL);
   }
-  xbt_dynar_iterator_delete(it);
 
   return MSG_OK;
 }
@@ -107,22 +105,22 @@ int broadcaster_send_file(const char *first)
     XBT_INFO("Sending (send) from %s into mailbox %s", me, first);
     status = MSG_task_send(task, first);
    
-    xbt_assert(status == MSG_OK, __FILE__ ": broadcaster_send_file() failed");
+    xbt_assert(status == MSG_OK, "broadcaster_send_file() failed");
   }
 
   return MSG_OK;
 }
 
-/* FIXME: I should iterate nodes in the same order as the one used to build the chain */
-int broadcaster_finish(xbt_dynar_t host_list)
+int broadcaster_finish(xbt_dynar_iterator_t it)
 {
-  xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
   msg_task_t task = NULL;
-  const char *me = MSG_host_get_name(MSG_host_self());
+  const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
   const char *current_host = NULL;
   char **cur = NULL;
 
-  /* Send goodbye message to every peer */
+  xbt_dynar_iterator_seek(it, 0);
+
+  /* Send goodbye message to every peer in the order generated by iterator it */
   for (cur = (char**)xbt_dynar_iterator_next(it); cur != NULL; cur = (char**)xbt_dynar_iterator_next(it)) {
     /* Send message to current peer */
     current_host = *cur;
@@ -144,16 +142,20 @@ int broadcaster(int argc, char *argv[])
 
   XBT_INFO("broadcaster");
 
-  /* Check that every host given by the hostcount in argv[1] exists and add it
-     to a dynamic array */
+  /* Add every mailbox given by the hostcount in argv[1] to a dynamic array */
   host_list = build_hostlist_from_hostcount(atoi(argv[1]));
   /*host_list = build_hostlist_from_argv(argc, argv);*/
   
+  /* Initialize iterator */
+  xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
+
   /* TODO: Error checking */
-  status = broadcaster_build_chain(&first, host_list);
+  status = broadcaster_build_chain(&first, host_list, it);
   status = broadcaster_send_file(first);
-  status = broadcaster_finish(host_list);
+  status = broadcaster_finish(it);
 
+  /* Destroy iterator and hostlist */
+  xbt_dynar_iterator_delete(it);
   delete_hostlist(host_list);
 
   return status;