Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
shutdown all hosted VMs when an host is turned off
[simgrid.git] / teshsuite / msg / host_on_off_processes / host_on_off_processes.c
index 79bf033..680b014 100644 (file)
@@ -1,23 +1,31 @@
-/* Copyright (c) 2010-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. 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 "simgrid/msg.h"            /* Yeah! If you want to use msg, you need to include simgrid/msg.h */
+#include "simgrid/msg.h"
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 xbt_dynar_t tests;
 int tasks_done = 0;
 
+static void task_cleanup_handler(void *task)
+{
+  if (task)
+    MSG_task_destroy(task);
+}
+
 static int process_daemon(int argc, char *argv[])
 {
+  msg_process_t self = MSG_process_self();
   XBT_INFO("  Start daemon on %s (%f)", MSG_host_get_name(MSG_host_self()), MSG_host_get_speed(MSG_host_self()));
   for(;;){
     msg_task_t task = MSG_task_create("daemon", MSG_host_get_speed(MSG_host_self()), 0, NULL);
+    MSG_process_set_data(self, task);
     XBT_INFO("  Execute daemon");
     MSG_task_execute(task);
+    MSG_process_set_data(self, NULL);
     MSG_task_destroy(task);
     tasks_done ++;
   }
@@ -37,11 +45,10 @@ static int process_sleep(int argc, char *argv[])
 
 static int commTX(int argc, char *argv[])
 {
-  msg_task_t task = NULL;
   const char * mailbox = "comm";
   XBT_INFO("  Start TX");
-  task = MSG_task_create("COMM", 0, 100000000, NULL);
-  MSG_task_isend(task, mailbox);
+  msg_task_t task = MSG_task_create("COMM", 0, 100000000, NULL);
+  MSG_task_dsend(task, mailbox, task_cleanup_handler);
   // We should wait a bit (if not the process will end before the communication, hence an exception on the other side).
   MSG_process_sleep(30);
   XBT_INFO("  TX done");
@@ -56,12 +63,13 @@ static int commRX(int argc, char *argv[])
   msg_error_t error = MSG_task_receive(&(task), mailbox);
   if (error==MSG_OK) {
     XBT_INFO("  Receive message: %s", task->name);
+    MSG_task_destroy(task);
   } else if (error==MSG_HOST_FAILURE) {
     XBT_INFO("  Receive message: HOST_FAILURE");
   } else if (error==MSG_TRANSFER_FAILURE) {
     XBT_INFO("  Receive message: TRANSFERT_FAILURE");
   } else {
-    XBT_INFO("  Receive message: %d", error);
+    XBT_INFO("  Receive message: %u", error);
   }
   XBT_INFO("  RX Done");
   return 0;
@@ -164,11 +172,12 @@ static int test_launcher(int argc, char *argv[])
     MSG_process_sleep(10);
     XBT_INFO("  Turn Jupiter off");
     MSG_host_off(jupiter);
-    XBT_INFO("Test 5 seems ok, cool !(number of Process : %d, it should be 2", MSG_process_get_number());
+    XBT_INFO("Test 5 seems ok (number of Process: %d, it should be 2)", MSG_process_get_number());
   }
 
   test =6;
   if (xbt_dynar_search_or_negative(tests, &test)!=-1){
+    MSG_process_set_data_cleanup(NULL); /* FIXME: we are leaking here, but removing this line changes the test output */
     XBT_INFO("Test 6: Turn on Jupiter, assign a VM on Jupiter, launch a process inside the VM, and turn off the node");
 
     // Create VM0
@@ -176,12 +185,12 @@ static int test_launcher(int argc, char *argv[])
     msg_vm_t vm0;
     msg_process_t daemon;
 
-    vm0 = MSG_vm_create (jupiter, "vm0", 1, 2048, 125, NULL, -1, 125, dpRate);
+    vm0 = MSG_vm_create(jupiter, "vm0", 1, 2048, 125, dpRate);
     MSG_vm_start(vm0);
 
     argvF = xbt_new(char*, 2);
     argvF[0] = xbt_strdup("process_daemon");
-    daemon = MSG_process_create_with_arguments("process_daemon", process_daemon, NULL, vm0, 1, argvF);
+    daemon   = MSG_process_create_with_arguments("process_daemon", process_daemon, NULL, (msg_host_t)vm0, 1, argvF);
 
     argvF = xbt_new(char*, 2);
     argvF[0] = xbt_strdup("process_daemonJUPI");
@@ -227,11 +236,13 @@ int main(int argc, char *argv[])
 
   MSG_create_environment(argv[1]);
 
+  MSG_process_set_data_cleanup(task_cleanup_handler);
   MSG_process_create("test_launcher", test_launcher, NULL, MSG_get_host_by_name("Tremblay"));
 
   res = MSG_main();
 
   XBT_INFO("Simulation time %g", MSG_get_clock());
+  xbt_dynar_free(&tests);
 
   return res != MSG_OK;
 }