/* alloc structures */
act = xbt_new0(s_smx_action_t, 1);
act->cond_list = xbt_fifo_new();
+ act->sem_list = xbt_fifo_new();
/* initialize them */
act->name = xbt_strdup(name);
act->source = sender;
-
+ act->category = NULL;
act->surf_action =
surf_workstation_model->extension.workstation.communicate(sender->host,
/* alloc structures */
act = xbt_new0(s_smx_action_t, 1);
act->cond_list = xbt_fifo_new();
+ act->sem_list = xbt_fifo_new();
/* initialize them */
act->source = host;
act->name = xbt_strdup(name);
+ act->category = NULL;
/* set communication */
act->surf_action =
surf_workstation_model->action_data_set(act->surf_action, act);
DEBUG1("Create execute action %p", act);
+#ifdef HAVE_TRACING
+ TRACE_smx_action_execute (act);
+#endif
return act;
}
/** \brief Creates a new sleep SIMIX action.
*
- * This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a host_error exception if the host crashed. The default SIMIX name of the action is "sleep".
+ * This function creates a SURF action and allocates the data necessary
+ * to create the SIMIX action. It can raise a host_error exception if the
+ * host crashed. The default SIMIX name of the action is "sleep".
+ *
* \param host SIMIX host where the sleep will run.
* \param duration Time duration of the sleep.
* \return A new SIMIX action
/* alloc structures */
act = xbt_new0(s_smx_action_t, 1);
act->cond_list = xbt_fifo_new();
+ act->sem_list = xbt_fifo_new();
/* initialize them */
act->source = host;
act->name = xbt_strdup(name);
+ act->category = NULL;
act->surf_action =
surf_workstation_model->extension.workstation.sleep(host->host, duration);
* This functions stops the execution of an action. It calls a surf functions.
* \param action The SIMIX action
*/
-void SIMIX_action_cancel(smx_action_t action)
+XBT_INLINE void SIMIX_action_cancel(smx_action_t action)
{
xbt_assert0((action != NULL), "Invalid parameter");
* \param action The SIMIX action
* \param priority The new priority
*/
-void SIMIX_action_set_priority(smx_action_t action, double priority)
+XBT_INLINE void SIMIX_action_set_priority(smx_action_t action, double priority)
{
xbt_assert0((action != NULL), "Invalid parameter");
"Conditional list not empty %d. There is a problem. Cannot destroy it now!",
xbt_fifo_size(action->cond_list));
+ xbt_assert1((xbt_fifo_size(action->sem_list) == 0),
+ "Semaphore list not empty %d. There is a problem. Cannot destroy it now!",
+ xbt_fifo_size(action->sem_list));
+
DEBUG1("Destroy action %p", action);
if (action->name)
xbt_free(action->name);
xbt_fifo_free(action->cond_list);
+ xbt_fifo_free(action->sem_list);
if (action->surf_action)
action->surf_action->model_type->action_unref(action->surf_action);
-
+#ifdef HAVE_TRACING
+ TRACE_smx_action_destroy (action);
+#endif
xbt_free(action);
return 1;
}
*
* \param action The SIMIX action
*/
-void SIMIX_action_use(smx_action_t action)
+XBT_INLINE void SIMIX_action_use(smx_action_t action)
{
XBT_IN3("(%p:'%s',%d)", action, action->name, action->refcount);
xbt_assert0((action != NULL), "Invalid parameter");
*
* \param action The SIMIX action
*/
-void SIMIX_action_release(smx_action_t action)
+XBT_INLINE void SIMIX_action_release(smx_action_t action)
{
xbt_assert0((action != NULL), "Invalid parameter");
}
/**
- * \brief Set an action to a condition
+ * \brief Set an action to a condition
*
- * Creates the "link" between an action and a condition. You have to call this function when you create an action and want to wait its ending.
- * \param action SIMIX action
- * \param cond SIMIX cond
+ * Creates the "link" between an action and a condition. You have to call this function when you create an action and want to wait its ending.
+ * \param action SIMIX action
+ * \param cond SIMIX cond
*/
void SIMIX_register_action_to_condition(smx_action_t action, smx_cond_t cond)
{
}
/**
- * \brief Unset an action to a condition.
+ * \brief Unset an action to a condition.
*
- * Destroys the "links" from the condition to this action.
- * \param action SIMIX action
- * \param cond SIMIX cond
+ * Destroys the "links" from the condition to this action.
+ * \param action SIMIX action
+ * \param cond SIMIX cond
*/
void SIMIX_unregister_action_to_condition(smx_action_t action,
smx_cond_t cond)
if(XBT_LOG_ISENABLED(simix_action, xbt_log_priority_debug))
__SIMIX_action_display_conditions(action);
-
+
xbt_fifo_remove_all(action->cond_list, cond);
if(XBT_LOG_ISENABLED(simix_action, xbt_log_priority_debug))
__SIMIX_action_display_conditions(action);
}
+/**
+ * \brief Link an action to a semaphore
+ *
+ * When the action terminates, the semaphore gets signaled automatically.
+ */
+XBT_INLINE void SIMIX_register_action_to_semaphore(smx_action_t action, smx_sem_t sem) {
+
+ DEBUG2("Register action %p to semaphore %p (and otherwise)", action, sem);
+ xbt_fifo_push(sem->actions, action);
+ xbt_fifo_push(action->sem_list, sem);
+}
+/**
+ * \brief Unset an action to a semaphore.
+ *
+ * Destroys the "links" from the semaphore to this action.
+ */
+XBT_INLINE void SIMIX_unregister_action_to_semaphore(smx_action_t action,
+ smx_sem_t sem)
+{
+ xbt_fifo_remove_all(sem->actions, action);
+ xbt_fifo_remove_all(action->sem_list, sem);
+}
/**
* \brief Return how much remais to be done in the action.
* \param action The SIMIX action
* \return Remains cost
*/
-double SIMIX_action_get_remains(smx_action_t action)
+XBT_INLINE double SIMIX_action_get_remains(smx_action_t action)
{
xbt_assert0((action != NULL), "Invalid parameter");
return surf_workstation_model->get_remains(action->surf_action);
/* alloc structures */
act = xbt_new0(s_smx_action_t, 1);
act->cond_list = xbt_fifo_new();
+ act->sem_list = xbt_fifo_new();
/* initialize them */
act->name = xbt_strdup(name);
+ act->category = NULL;
/* set action */
return act;
}
-e_surf_action_state_t SIMIX_action_get_state(smx_action_t action)
+XBT_INLINE e_surf_action_state_t SIMIX_action_get_state(smx_action_t action)
{
xbt_assert0((action != NULL), "Invalid parameter");
return surf_workstation_model->action_state_get(action->surf_action);
DEBUG1("\t %p", cond);
}
-char *SIMIX_action_get_name(smx_action_t action)
+XBT_INLINE char *SIMIX_action_get_name(smx_action_t action)
{
xbt_assert0((action != NULL), "Invalid parameter");
return action->name;
}
-
-void SIMIX_action_signal_all(smx_action_t action)
+/** @brief Change the name of the action. Warning, the string you provide is not strdup()ed */
+XBT_INLINE void SIMIX_action_set_name(smx_action_t action,char *name)
{
+ xbt_free(action->name);
+ action->name = name;
+}
+
+/** @brief broadcast any condition and release any semaphore including this action */
+void SIMIX_action_signal_all(smx_action_t action){
smx_cond_t cond;
+ smx_sem_t sem;
while ((cond = xbt_fifo_pop(action->cond_list)))
SIMIX_cond_broadcast(cond);
- return;
+ while ((sem = xbt_fifo_pop(action->sem_list)))
+ SIMIX_sem_release(sem);
}