Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
global variables successfully moved into encapsulating structures.
[simgrid.git] / src / msg / m_process.c
index 6e025d3..baf3316 100644 (file)
@@ -36,27 +36,37 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg, "Logging specific to MSG (proc
  * \sa MSG_process_create_with_arguments
  */
 m_process_t MSG_process_create(const char *name,
-                              m_process_code_t code, void *data,
+                              xbt_main_func_t code, void *data,
                               m_host_t host)
 {
   return MSG_process_create_with_arguments(name, code, data, host, -1, NULL);
 }
 
-static void MSG_process_cleanup(void *arg)
+void __MSG_process_cleanup(void *arg)
 {
        /* arg is a pointer to a simix process, we can get the msg process with the field data */
-       m_process_t proc = ((smx_process_t)arg)->data;
-  xbt_fifo_remove(msg_global->process_list, proc);
-       SIMIX_process_cleanup(arg);
-  free(proc->name);
-  proc->name = NULL;
-  free(proc->simdata);
-  proc->simdata = NULL;
-  free(proc);
-
-       return;
+   m_process_t proc = ((smx_process_t)arg)->data;
+   xbt_fifo_remove(msg_global->process_list, proc);
+   SIMIX_process_cleanup(arg);
+   free(proc->name);
+   proc->name = NULL;
+   free(proc->simdata);
+   proc->simdata = NULL;
+   free(proc);
+
+   return;
 }
 
+/* This function creates a MSG process. It has the prototype by SIMIX_function_register_process_create */
+void *_MSG_process_create_from_SIMIX(const char *name,
+                                    xbt_main_func_t code, void *data,
+                                    char * hostname, int argc, char **argv)
+{
+       m_host_t host = MSG_get_host_by_name(hostname);
+       return (void*)MSG_process_create_with_arguments(name,code,data,host,argc,argv);
+}
+
+
 /** \ingroup m_process_management
  * \brief Creates and runs a new #m_process_t.
 
@@ -82,18 +92,8 @@ static void MSG_process_cleanup(void *arg)
  * \return The new corresponding object.
  */
 
-
-
-m_process_t __MSG_process_create_with_arguments(const char *name,
-                                             m_process_code_t code, void *data,
-                                             char * hostname, int argc, char **argv)
-{
-       m_host_t host = MSG_get_host_by_name(hostname);
-       return MSG_process_create_with_arguments(name,code,data,host,argc,argv);
-}
-
 m_process_t MSG_process_create_with_arguments(const char *name,
-                                             m_process_code_t code, void *data,
+                                             xbt_main_func_t code, void *data,
                                              m_host_t host, int argc, char **argv)
 {
   simdata_process_t simdata = xbt_new0(s_simdata_process_t,1);
@@ -103,15 +103,17 @@ m_process_t MSG_process_create_with_arguments(const char *name,
   /* Simulator Data */
   simdata->PID = msg_global->PID++;
        simdata->waiting_task = NULL;
-  simdata->host = host;
+  simdata->m_host = host;
   simdata->argc = argc;
   simdata->argv = argv;
-       simdata->smx_process = SIMIX_process_create(name, (smx_process_code_t)code, (void*)process, host->name, argc, argv, MSG_process_cleanup );
+  simdata->s_process = SIMIX_process_create(name, code, 
+                                           (void*)process, host->name, argc, argv);
 
-       if (SIMIX_process_self()) {
-               simdata->PPID = MSG_process_get_PID(SIMIX_process_self()->data);
-       }
-       else simdata->PPID = -1;
+  if (SIMIX_process_self()) {
+    simdata->PPID = MSG_process_get_PID(SIMIX_process_self()->data);
+  } else {
+    simdata->PPID = -1;
+  }
   simdata->last_errno=MSG_OK;
 
 
@@ -120,11 +122,16 @@ m_process_t MSG_process_create_with_arguments(const char *name,
   process->simdata = simdata;
   process->data = data;
 
-       xbt_fifo_unshift(msg_global->process_list, process); 
+  xbt_fifo_unshift(msg_global->process_list, process); 
 
   return process;
 }
 
+
+void _MSG_process_kill_from_SIMIX(void *p) {
+   MSG_process_kill((m_process_t)p);
+}
+
 /** \ingroup m_process_management
  * \param process poor victim
  *
@@ -134,22 +141,22 @@ void MSG_process_kill(m_process_t process)
 {
   simdata_process_t p_simdata = process->simdata;
 
-  DEBUG3("Killing %s(%ld) on %s",process->name, p_simdata->PID, p_simdata->host->name);
+  DEBUG3("Killing %s(%d) on %s",
+        process->name, p_simdata->PID, p_simdata->m_host->name);
 
-       if(p_simdata->waiting_task) {
-               DEBUG1("Canceling waiting task %s",p_simdata->waiting_task->name);
+  if(p_simdata->waiting_task) {
+    DEBUG1("Canceling waiting task %s",p_simdata->waiting_task->name);
     if(p_simdata->waiting_task->simdata->compute) {
-                       SIMIX_action_cancel(p_simdata->waiting_task->simdata->compute);
-               }
-    else if (p_simdata->waiting_task->simdata->comm) {
-                       SIMIX_action_cancel(p_simdata->waiting_task->simdata->comm);
+      SIMIX_action_cancel(p_simdata->waiting_task->simdata->compute);
+    } else if (p_simdata->waiting_task->simdata->comm) {
+      SIMIX_action_cancel(p_simdata->waiting_task->simdata->comm);
     } 
   }
 
   xbt_fifo_remove(msg_global->process_list,process);
-       SIMIX_process_kill(process->simdata->smx_process);
+  SIMIX_process_kill(process->simdata->s_process);
 
-       return;
+  return;
 }
 
 /** \ingroup m_process_management
@@ -204,7 +211,7 @@ m_host_t MSG_process_get_host(m_process_t process)
 {
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
 
-  return (((simdata_process_t) process->simdata)->host);
+  return (((simdata_process_t) process->simdata)->m_host);
 }
 
 /** \ingroup m_process_management
@@ -215,7 +222,7 @@ m_host_t MSG_process_get_host(m_process_t process)
    whose PID is equal to \a PID. If no host is found, \c NULL is returned. 
    Note that the PID are uniq in the whole simulation, not only on a given host.
  */
-m_process_t MSG_process_from_PID(long int PID)
+m_process_t MSG_process_from_PID(int PID)
 {
   xbt_fifo_item_t i = NULL;
   m_process_t process = NULL;
@@ -230,11 +237,14 @@ m_process_t MSG_process_from_PID(long int PID)
  * \brief Returns the process ID of \a process.
  *
  * This functions checks whether \a process is a valid pointer or not 
-   and return its PID.
+   and return its PID (or 0 in case of problem).
  */
-long int MSG_process_get_PID(m_process_t process)
+int MSG_process_get_PID(m_process_t process)
 {
-  xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
+  /* Do not raise an exception here: this function is used in the logs, 
+     and it will be called back by the exception handling stuff */
+  if (process == NULL || process->simdata == NULL)
+     return 0;
 
   return (((simdata_process_t) process->simdata)->PID);
 }
@@ -246,7 +256,7 @@ long int MSG_process_get_PID(m_process_t process)
    and return its PID. Returns -1 if the agent has not been created by 
    another agent.
  */
-long int MSG_process_get_PPID(m_process_t process)
+int MSG_process_get_PPID(m_process_t process)
 {
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
 
@@ -271,7 +281,7 @@ const char *MSG_process_get_name(m_process_t process)
  *
  * This functions returns the PID of the currently running #m_process_t.
  */
-long int MSG_process_self_PID(void)
+int MSG_process_self_PID(void)
 {
   return (MSG_process_get_PID(MSG_process_self()));
 }
@@ -282,7 +292,7 @@ long int MSG_process_self_PID(void)
  * This functions returns the PID of the parent of the currently
  * running #m_process_t.
  */
-long int MSG_process_self_PPID(void)
+int MSG_process_self_PPID(void)
 {
   return (MSG_process_get_PPID(MSG_process_self()));
 }
@@ -315,7 +325,7 @@ MSG_error_t MSG_process_suspend(m_process_t process)
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
   CHECK_HOST();
 
-       SIMIX_process_suspend(process->simdata->smx_process);
+       SIMIX_process_suspend(process->simdata->s_process);
   MSG_RETURN(MSG_OK);
 }
 
@@ -331,7 +341,7 @@ MSG_error_t MSG_process_resume(m_process_t process)
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
   CHECK_HOST();
 
-       SIMIX_process_resume(process->simdata->smx_process);
+       SIMIX_process_resume(process->simdata->s_process);
   MSG_RETURN(MSG_OK);
 }
 
@@ -344,6 +354,6 @@ MSG_error_t MSG_process_resume(m_process_t process)
 int MSG_process_is_suspended(m_process_t process)
 {
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
-       return SIMIX_process_is_suspended(process->simdata->smx_process);
+       return SIMIX_process_is_suspended(process->simdata->s_process);
 }