Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
avoid any name clashes with msg/private.h so that the java interface can do crude...
[simgrid.git] / src / simix / smx_process.c
index 9d5949a..292177f 100644 (file)
@@ -8,34 +8,19 @@
 #include "private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix,
                                "Logging specific to SIMIX (process)");
-/** \defgroup m_process_management Management Functions of Agents
- *  \brief This section describes the agent structure of MSG
- *  (#m_process_t) and the functions for managing it.
- *    \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Agents" --> \endhtmlonly
- * 
- *  We need to simulate many independent scheduling decisions, so
- *  the concept of <em>process</em> is at the heart of the
- *  simulator. A process may be defined as a <em>code</em>, with
- *  some <em>private data</em>, executing in a <em>location</em>.
- *  \see m_process_t
- */
 
 /******************************** Process ************************************/
-/** \ingroup m_process_management
- * \brief Creates and runs a new #m_process_t.
+/**
+ * \brief Creates and runs a new #smx_process_t.
  *
- * Does exactly the same as #MSG_process_create_with_arguments but without 
-   providing standard arguments (\a argc, \a argv, \a start_time, \a kill_time).
- * \sa MSG_process_create_with_arguments
+ * Does exactly the same as #SIMIX_process_create_with_arguments but without 
+   providing standard arguments (\a argc, \a argv).
+ * \see SIMIX_process_create_with_arguments
  */
-smx_process_t SIMIX_process_create(const char *name,
-                              smx_process_code_t code, void *data,
-                              const char * hostname, void * clean_process_function)
-{
-  return SIMIX_process_create_with_arguments(name, code, data, hostname, -1, NULL, clean_process_function);
-}
+
 
 void SIMIX_process_cleanup(void *arg)
 {
@@ -44,36 +29,27 @@ void SIMIX_process_cleanup(void *arg)
   xbt_swag_remove(arg, ((smx_process_t) arg)->simdata->host->simdata->process_list);
   free(((smx_process_t) arg)->name);
   ((smx_process_t) arg)->name = NULL;
+
   free(((smx_process_t) arg)->simdata);
   ((smx_process_t) arg)->simdata = NULL;
   free(arg);
 }
 
-/** \ingroup m_process_management
- * \brief Creates and runs a new #m_process_t.
-
- * A constructor for #m_process_t taking four arguments and returning the 
- * corresponding object. The structure (and the corresponding thread) is
- * created, and put in the list of ready process.
- * \param name a name for the object. It is for user-level information
-   and can be NULL.
- * \param code is a function describing the behavior of the agent. It
-   should then only use functions described in \ref
-   m_process_management (to create a new #m_process_t for example),
-   in \ref m_host_management (only the read-only functions i.e. whose
-   name contains the word get), in \ref m_task_management (to create
-   or destroy some #m_task_t for example) and in \ref
-   msg_gos_functions (to handle file transfers and task processing).
- * \param data a pointer to any data one may want to attach to the new
-   object.  It is for user-level information and can be NULL. It can
-   be retrieved with the function \ref MSG_process_get_data.
+/** 
+ * \brief Creates and runs a new #smx_process_t.
+ *
+ * A constructor for #m_process_t taking four arguments and returning the corresponding object. The structure (and the corresponding thread) is created, and put in the list of ready process.
+ *
+ * \param name a name for the object. It is for user-level information and can be NULL.
+* \param data a pointer to any data one may want to attach to the new object.  It is for user-level information and can be NULL. It can be retrieved with the function \ref MSG_process_get_data.
  * \param host the location where the new agent is executed.
  * \param argc first argument passed to \a code
  * \param argv second argument passed to \a code
- * \see m_process_t
+ * \param clean_process_function The cleanup function of user process. It will be called when the process finish. This function have to call the SIMIX_process_cleanup.        
+ * \see smx_process_t
  * \return The new corresponding object.
  */
-smx_process_t SIMIX_process_create_with_arguments(const char *name,
+smx_process_t SIMIX_process_create(const char *name,
                                              smx_process_code_t code, void *data,
                                              const char * hostname, int argc, char **argv, void * clean_process_function)
 {
@@ -86,6 +62,8 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name,
   /* Simulator Data */
 
   simdata->host = host;
+       simdata->mutex = NULL;
+       simdata->cond = NULL;
   simdata->argc = argc;
   simdata->argv = argv;
        if (clean_process_function) {
@@ -98,8 +76,6 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name,
                                             SIMIX_process_cleanup, process, 
                                             simdata->argc, simdata->argv);
        }
-  //simdata->last_errno=SIMIX_OK;
-
 
   /* Process structure */
   process->name = xbt_strdup(name);
@@ -122,20 +98,15 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name,
 }
 
 
-
-
-/** \ingroup m_process_management
+/** \brief Kill a SIMIX process
+ *
+ * This function simply kills a \a process... scarry isn't it ? :). Removes it from the mutex or condition that it can be blocked.
  * \param process poor victim
  *
- * This function simply kills a \a process... scarry isn't it ? :)
  */
 void SIMIX_process_kill(smx_process_t process)
-{
-  //int i;
+{      
   smx_simdata_process_t p_simdata = process->simdata;
-  //simdata_host_t h_simdata= p_simdata->host->simdata;
-  //int _cursor;
-  //smx_process_t proc = NULL;
 
   DEBUG2("Killing %s on %s",process->name, p_simdata->host->name);
   
@@ -145,31 +116,6 @@ void SIMIX_process_kill(smx_process_t process)
        if (p_simdata->cond) {
                xbt_swag_remove(process,p_simdata->cond->sleeping);
        }
-  /*
-  
-  if(p_simdata->waiting_task) {
-    xbt_dynar_foreach(p_simdata->waiting_task->simdata->sleeping,_cursor,proc) {
-      if(proc==process) 
-       xbt_dynar_remove_at(p_simdata->waiting_task->simdata->sleeping,_cursor,&proc);
-    }
-    if(p_simdata->waiting_task->simdata->compute)
-      surf_workstation_resource->common_public->
-       action_free(p_simdata->waiting_task->simdata->compute);
-    else if (p_simdata->waiting_task->simdata->comm) {
-      surf_workstation_resource->common_public->
-       action_change_state(p_simdata->waiting_task->simdata->comm,SURF_ACTION_FAILED);
-      surf_workstation_resource->common_public->
-       action_free(p_simdata->waiting_task->simdata->comm);
-    } else {
-      xbt_die("UNKNOWN STATUS. Please report this bug.");
-    }
-  }
-
-  if ((i==msg_global->max_channel) && (process!=MSG_process_self()) && 
-      (!p_simdata->waiting_task)) {
-    xbt_die("UNKNOWN STATUS. Please report this bug.");
-  }
-*/
   xbt_swag_remove(process,simix_global->process_to_run);
   xbt_swag_remove(process,simix_global->process_list);
   xbt_context_kill(process->simdata->context);
@@ -180,11 +126,12 @@ void SIMIX_process_kill(smx_process_t process)
   }
 }
 
-/** \ingroup m_process_management
- * \brief Return the user data of a #m_process_t.
+/**
+ * \brief Return the user data of a #smx_process_t.
  *
- * This functions checks whether \a process is a valid pointer or not 
-   and return the user data associated to \a process if it is possible.
+ * This functions checks whether \a process is a valid pointer or not and return the user data associated to \a process if it is possible.
+ * \param process SIMIX process
+ * \return A void pointer to the user data
  */
 void *SIMIX_process_get_data(smx_process_t process)
 {
@@ -193,11 +140,12 @@ void *SIMIX_process_get_data(smx_process_t process)
   return (process->data);
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Set the user data of a #m_process_t.
  *
- * This functions checks whether \a process is a valid pointer or not 
-   and set the user data associated to \a process if it is possible.
+ * This functions checks whether \a process is a valid pointer or not and set the user data associated to \a process if it is possible.
+ * \param process SIMIX process
+ * \param data User data
  */
 void SIMIX_process_set_data(smx_process_t process,void *data)
 {
@@ -209,12 +157,12 @@ void SIMIX_process_set_data(smx_process_t process,void *data)
   return ;
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Return the location on which an agent is running.
  *
- * This functions checks whether \a process is a valid pointer or not 
-   and return the m_host_t corresponding to the location on which \a 
-   process is running.
+ * This functions checks whether \a process is a valid pointer or not and return the m_host_t corresponding to the location on which \a process is running.
+ * \param process SIMIX process
+ * \return SIMIX host
  */
 smx_host_t SIMIX_process_get_host(smx_process_t process)
 {
@@ -223,11 +171,12 @@ smx_host_t SIMIX_process_get_host(smx_process_t process)
   return (process->simdata->host);
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Return the name of an agent.
  *
- * This functions checks whether \a process is a valid pointer or not 
-   and return its name.
+ * This functions checks whether \a process is a valid pointer or not and return its name.
+ * \param process SIMIX process
+ * \return The process name
  */
 const char *SIMIX_process_get_name(smx_process_t process)
 {
@@ -236,21 +185,22 @@ const char *SIMIX_process_get_name(smx_process_t process)
   return (process->name);
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Return the current agent.
  *
- * This functions returns the currently running #m_process_t.
+ * This functions returns the currently running #smx_process_t.
+ * \return The SIMIX process
  */
 smx_process_t SIMIX_process_self(void)
 {
   return simix_global ? simix_global->current_process : NULL;
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Suspend the process.
  *
- * This functions suspend the process by suspending the task on which
- * it was waiting for the completion.
+ * This functions suspend the process by suspending the action on which it was waiting for the completion.
+ *     \param process SIMIX process
  */
 void SIMIX_process_suspend(smx_process_t process)
 {
@@ -302,18 +252,18 @@ void SIMIX_process_suspend(smx_process_t process)
   return ;
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Resume a suspended process.
  *
- * This functions resume a suspended process by resuming the task on
- * which it was waiting for the completion.
+ * This functions resume a suspended process by resuming the task on which it was waiting for the completion.
+ * \param process SIMIX process
  */
 void SIMIX_process_resume(smx_process_t process)
 {
   smx_simdata_process_t simdata = NULL;
 
   xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters");
-  CHECK_HOST();
+  SIMIX_CHECK_HOST();
 
   if(process == SIMIX_process_self()) {
                return; 
@@ -345,11 +295,12 @@ void SIMIX_process_resume(smx_process_t process)
 
 }
 
-/** \ingroup m_process_management
+/**
  * \brief Returns true if the process is suspended .
  *
- * This checks whether a process is suspended or not by inspecting the
- * task on which it was waiting for the completion.
+ * This checks whether a process is suspended or not by inspecting the task on which it was waiting for the completion.
+ * \param process SIMIX process
+ * \return 1, if the process is suspended, else 0.
  */
 int SIMIX_process_is_suspended(smx_process_t process)
 {