+/** \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;
+
+
+ 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;
+}