+/** \brief Creates a new SIMIX action to communicate two hosts.
+ *
+ * This function creates a SURF action and allocates the data necessary to create the SIMIX action. It can raise a network_error exception if the host is unavailable.
+ * \param sender SIMIX host sender
+ * \param receiver SIMIX host receiver
+ * \param name Action name
+ * \param size Communication size (in bytes)
+ * \param rate Communication rate between hosts.
+ * \return A new SIMIX action
+ * */
+smx_action_t SIMIX_action_communicate(smx_host_t sender,
+ smx_host_t receiver,
+ const char *name, double size,
+ double rate)
+{
+ smx_action_t act;
+
+ /* check if the host is active */
+ if (surf_workstation_model->extension.
+ workstation.get_state(sender->host) != SURF_RESOURCE_ON) {
+ THROW1(network_error, 0,
+ "Host %s failed, you cannot call this function", sender->name);
+ }
+ if (surf_workstation_model->extension.workstation.
+ get_state(receiver->host) != SURF_RESOURCE_ON) {
+ THROW1(network_error, 0,
+ "Host %s failed, you cannot call this function",
+ receiver->name);
+ }
+
+ /* 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;
+#ifdef HAVE_TRACING
+ act->category = NULL;
+#endif
+
+ act->surf_action =
+ surf_workstation_model->extension.workstation.
+ communicate(sender->host, receiver->host, size, rate);
+ surf_workstation_model->action_data_set(act->surf_action, act);
+
+ DEBUG1("Create communicate action %p", act);
+ return act;
+}
+
+/** \brief Creates a new SIMIX action to execute an 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.
+ * \param host SIMIX host where the action will be executed
+ * \param name Action name
+ * \param amount Task amount (in bytes)
+ * \return A new SIMIX action
+ * */
+smx_action_t SIMIX_action_execute(smx_host_t host, const char *name,
+ double amount)
+{
+ smx_action_t act;
+
+ /* check if the host is active */
+ if (surf_workstation_model->extension.
+ workstation.get_state(host->host) != SURF_RESOURCE_ON) {
+ THROW1(host_error, 0, "Host %s failed, you cannot call this function",
+ host->name);
+ }
+
+ /* 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);
+#ifdef HAVE_TRACING
+ act->category = NULL;
+#endif
+
+ /* set execute */
+ act->surf_action =
+ surf_workstation_model->extension.workstation.execute(host->host,
+ amount);
+
+ surf_workstation_model->action_data_set(act->surf_action, act);
+
+ DEBUG1("Create execute action %p", act);
+#ifdef HAVE_TRACING
+ TRACE_smx_action_execute(act);
+ TRACE_surf_action(act->surf_action, act->category);
+#endif
+ return act;
+}