static int receiver_fun(int argc, char *argv[]) { XBT_INFO("Receiving"); msg_task_t task = NULL; MSG_task_receive_with_timeout(&task, MSG_host_get_name(MSG_host_self()), DBL_MAX); xbt_assert(MSG_task_get_sender(task), "No sender received"); XBT_INFO("Got a message sent by '%s'", MSG_process_get_name(MSG_task_get_sender(task))); MSG_task_destroy(task); return 0; }
/** * \brief Blocks the current process until a communication is finished. * \param L a Lua state * \return number of values returned to Lua * * - Argument 1 (comm): a comm (previously created by isend or irecv) * - Argument 2 (number, optional): timeout (default is no timeout) * - Return values (task or nil + string): in case of success, returns the task * received if you are the receiver and nil if you are the sender. In case of * failure, returns nil plus an error string. */ static int l_comm_wait(lua_State* L) { msg_comm_t comm = sglua_check_comm(L, 1); double timeout = -1; if (lua_gettop(L) >= 2) { timeout = luaL_checknumber(L, 2); } /* comm ... */ msg_error_t res = MSG_comm_wait(comm, timeout); if (res == MSG_OK) { msg_task_t task = MSG_comm_get_task(comm); if (MSG_task_get_sender(task) == MSG_process_self()) { /* I'm the sender */ return 0; } else { /* I'm the receiver: find the Lua task from the C task */ sglua_task_unregister(L, task); /* comm ... task */ return 1; } } else { /* the communication has failed */ lua_pushnil(L); /* comm ... nil */ lua_pushstring(L, sglua_get_msg_error(res)); /* comm ... nil error */ return 2; } }
static void send_mrsg_data (msg_task_t msg) { char mailbox[MAILBOX_ALIAS_SIZE]; double data_size; size_t my_id; mrsg_task_info_t ti; my_id = get_mrsg_worker_id (MSG_host_self ()); sprintf (mailbox, TASK_MRSG_MAILBOX, get_mrsg_worker_id (MSG_task_get_source (msg)), MSG_process_get_PID (MSG_task_get_sender (msg))); if (mrsg_message_is (msg, SMS_GET_MRSG_CHUNK)) { MSG_task_dsend (MSG_task_create ("DATA-C", 0.0, config_mrsg.mrsg_chunk_size, NULL), mailbox, NULL); } else if (mrsg_message_is (msg, SMS_GET_INTER_MRSG_PAIRS)) { ti = (mrsg_task_info_t) MSG_task_get_data (msg); data_size = job_mrsg.map_output[my_id][ti->mrsg_tid] - ti->map_output_copied[my_id]; MSG_task_dsend (MSG_task_create ("DATA-IP", 0.0, data_size, NULL), mailbox, NULL); } MSG_task_destroy (msg); }
/** * @brief Returns whether a communication is finished. * * Unlike wait(), This function always returns immediately. * * - Argument 1 (comm): a comm (previously created by isend or irecv) * - Return values (task/boolean or nil + string): if the communication is not * finished, return false. If the communication is finished and was successful, * returns the task received if you are the receiver or true if you are the * sender. If the communication is finished and has failed, returns nil * plus an error string. */ static int l_comm_test(lua_State* L) { msg_comm_t comm = sglua_check_comm(L, 1); /* comm ... */ if (!MSG_comm_test(comm)) { /* not finished yet */ lua_pushboolean(L, 0); /* comm ... false */ return 1; } else { /* finished but may have failed */ msg_error_t res = MSG_comm_get_status(comm); if (res == MSG_OK) { msg_task_t task = MSG_comm_get_task(comm); if (MSG_task_get_sender(task) == MSG_process_self()) { /* I'm the sender */ lua_pushboolean(L, 1); /* comm ... true */ return 1; } else { /* I'm the receiver: find the Lua task from the C task*/ sglua_task_unregister(L, task); /* comm ... task */ return 1; } } else { /* the communication has failed */ lua_pushnil(L); /* comm ... nil */ lua_pushstring(L, sglua_get_msg_error(res)); /* comm ... nil error */ return 2; } } }