/** Sender function */ int sender(int argc, char *argv[]) { long number_of_tasks = atol(argv[1]); double task_comp_size = atof(argv[2]); double task_comm_size = atof(argv[3]); long receivers_count = atol(argv[4]); double sleep_start_time = atof(argv[5]); double sleep_test_time = atof(argv[6]); XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time); msg_comm_t comm = NULL; int i; m_task_t task = NULL; MSG_process_sleep(sleep_start_time); for (i = 0; i < number_of_tasks; i++) { char mailbox[256]; char sprintf_buffer[256]; sprintf(mailbox, "receiver-%ld", i % receivers_count); sprintf(sprintf_buffer, "Task_%d", i); task = MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size, NULL); comm = MSG_task_isend(task, mailbox); XBT_INFO("Send to receiver-%ld Task_%d", i % receivers_count, i); if (sleep_test_time == 0) { MSG_comm_wait(comm, -1); } else { while (MSG_comm_test(comm) == 0) { MSG_process_sleep(sleep_test_time); }; MSG_comm_destroy(comm); } } for (i = 0; i < receivers_count; i++) { char mailbox[80]; sprintf(mailbox, "receiver-%ld", i % receivers_count); task = MSG_task_create("finalize", 0, 0, 0); comm = MSG_task_isend(task, mailbox); XBT_INFO("Send to receiver-%ld finalize", i % receivers_count); if (sleep_test_time == 0) { MSG_comm_wait(comm, -1); } else { while (MSG_comm_test(comm) == 0) { MSG_process_sleep(sleep_test_time); }; MSG_comm_destroy(comm); } } XBT_INFO("Goodbye now!"); return 0; } /* end_of_sender */
/* Sender process expects 6 arguments: */ static int sender(int argc, char *argv[]) { long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s"); /* - number of tasks */ double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /* - computational cost */ double task_comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /* - communication cost */ long receivers_count = xbt_str_parse_int(argv[4], "Invalid amount of receivers: %s"); /* - number of receivers */ double sleep_start_time = xbt_str_parse_double(argv[5], "Invalid sleep start time: %s"); /* - start time */ double sleep_test_time = xbt_str_parse_double(argv[6], "Invalid test time: %s"); /* - test time */ XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time); int i; msg_task_t task = NULL; msg_comm_t comm = NULL; MSG_process_sleep(sleep_start_time); for (i = 0; i < number_of_tasks; i++) { char mailbox[256]; char snprintf_buffer[256]; snprintf(mailbox,255, "receiver-%ld", i % receivers_count); snprintf(snprintf_buffer,255, "Task_%d", i); /* This process first creates a task and send it asynchronously with @ref MSG_task_isend. Then, if: */ task = MSG_task_create(snprintf_buffer, task_comp_size, task_comm_size, NULL); comm = MSG_task_isend(task, mailbox); XBT_INFO("Send to receiver-%ld Task_%d", i % receivers_count, i); if (sleep_test_time > 0) { /* - "test_time" is set to 0, wait on @ref MSG_comm_wait */ while (MSG_comm_test(comm) == 0) { /* - Call @ref MSG_comm_test every "test_time" otherwise */ MSG_process_sleep(sleep_test_time); }; } else { MSG_comm_wait(comm, -1); } MSG_comm_destroy(comm); } for (i = 0; i < receivers_count; i++) { char mailbox[80]; snprintf(mailbox,79, "receiver-%ld", i % receivers_count); task = MSG_task_create("finalize", 0, 0, 0); comm = MSG_task_isend(task, mailbox); XBT_INFO("Send to receiver-%ld finalize", i % receivers_count); if (sleep_test_time > 0) { while (MSG_comm_test(comm) == 0) { MSG_process_sleep(sleep_test_time); } } else { MSG_comm_wait(comm, -1); } MSG_comm_destroy(comm); } XBT_INFO("Goodbye now!"); return 0; }
JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Comm_test(JNIEnv *env, jobject jcomm) { msg_comm_t comm; comm = (msg_comm_t) (uintptr_t) env->GetLongField(jcomm, jcomm_field_Comm_bind); jboolean finished = env->GetBooleanField(jcomm, jcomm_field_Comm_finished); if (finished == JNI_TRUE) { return JNI_TRUE; } if (not comm) { jxbt_throw_null(env, "comm is null"); return JNI_FALSE; } if (MSG_comm_test(comm)) { msg_error_t status = MSG_comm_get_status(comm); if (status == MSG_OK) { jcomm_bind_task(env,jcomm); return JNI_TRUE; } else { //send the correct exception jmsg_throw_status(env,status); } } return JNI_FALSE; }
/** Receiver function */ int receiver(int argc, char *argv[]) { m_task_t task = NULL; MSG_error_t res; int id = -1; char mailbox[80]; msg_comm_t res_irecv; double sleep_start_time = atof(argv[2]); double sleep_test_time = atof(argv[3]); XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time); int read; read = sscanf(argv[1], "%d", &id); xbt_assert(read, "Invalid argument %s\n", argv[1]); MSG_process_sleep(sleep_start_time); sprintf(mailbox, "receiver-%d", id); while (1) { res_irecv = MSG_task_irecv(&(task), mailbox); XBT_INFO("Wait to receive a task"); if (sleep_test_time == 0) { res = MSG_comm_wait(res_irecv, -1); xbt_assert(res == MSG_OK, "MSG_task_get failed"); } else { while (MSG_comm_test(res_irecv) == 0) { MSG_process_sleep(sleep_test_time); }; MSG_comm_destroy(res_irecv); } XBT_INFO("Received \"%s\"", MSG_task_get_name(task)); if (!strcmp(MSG_task_get_name(task), "finalize")) { MSG_task_destroy(task); break; } XBT_INFO("Processing \"%s\"", MSG_task_get_name(task)); MSG_task_execute(task); XBT_INFO("\"%s\" done", MSG_task_get_name(task)); MSG_task_destroy(task); task = NULL; } XBT_INFO("I'm done. See you!"); return 0; } /* end_of_receiver */
int process_pending_connections(xbt_dynar_t q) { unsigned int iter; int status; int empty = 0; msg_comm_t comm; xbt_dynar_foreach(q, iter, comm) { empty = 1; if (MSG_comm_test(comm)) { MSG_comm_destroy(comm); status = MSG_comm_get_status(comm); xbt_assert(status == MSG_OK, "process_pending_connections() failed"); xbt_dynar_cursor_rm(q, &iter); empty = 0; } }
/* Receiver process expects 3 arguments: */ static int receiver(int argc, char *argv[]) { msg_task_t task = NULL; XBT_ATTRIB_UNUSED msg_error_t res; char mailbox[80]; msg_comm_t res_irecv; int id = xbt_str_parse_int(argv[1], "Invalid id: %s"); /* - unique id */ double sleep_start_time = xbt_str_parse_double(argv[2], "Invalid sleep start parameter: %s"); /* - start time */ double sleep_test_time = xbt_str_parse_double(argv[3], "Invalid sleep test parameter: %s"); /* - test time */ XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time); MSG_process_sleep(sleep_start_time); /* This process first sleeps for "start time" seconds. */ snprintf(mailbox,79, "receiver-%d", id); while (1) { res_irecv = MSG_task_irecv(&(task), mailbox); /* Then it posts asynchronous receives (@ref MSG_task_irecv) and*/ XBT_INFO("Wait to receive a task"); if (sleep_test_time > 0) { /* - if "test_time" is set to 0, wait on @ref MSG_comm_wait */ while (MSG_comm_test(res_irecv) == 0) { /* - Call @ref MSG_comm_test every "test_time" otherwise */ MSG_process_sleep(sleep_test_time); } } else { res = MSG_comm_wait(res_irecv, -1); xbt_assert(res == MSG_OK, "MSG_task_get failed"); } MSG_comm_destroy(res_irecv); XBT_INFO("Received \"%s\"", MSG_task_get_name(task)); if (strcmp(MSG_task_get_name(task), "finalize") == 0) { /* If the received task is "finalize", the process ends */ MSG_task_destroy(task); break; } XBT_INFO("Processing \"%s\"", MSG_task_get_name(task)); /* Otherwise, the task is processed */ MSG_task_execute(task); XBT_INFO("\"%s\" done", MSG_task_get_name(task)); MSG_task_destroy(task); task = NULL; } XBT_INFO("I'm done. See you!"); return 0; }
/** * @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; } } }
/** * \brief Node Function * Arguments: * - my id * - the id of a guy I know in the system (except for the first node) * - the time to sleep before I join (except for the first node) * - the deadline time */ static int node(int argc, char *argv[]) { double init_time = MSG_get_clock(); msg_task_t task_received = NULL; int join_success = 0; double deadline; xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node"); s_node_t node = {0}; node.id = xbt_str_parse_int(argv[1], "Invalid ID: %s"); node.known_id = -1; node.ready = -1; node.pending_tasks = xbt_fifo_new(); get_mailbox(node.id, node.mailbox); XBT_DEBUG("New node with id %s (%08x)", node.mailbox, node.id); int i,j,d; for (i=0; i<LEVELS_COUNT; i++){ d = domain(node.id, i); for (j=0; j<LEVEL_SIZE; j++) node.routing_table[i][j] = (d==j) ? node.id : -1; } for (i=0; i<NEIGHBORHOOD_SIZE; i++) node.neighborhood_set[i] = -1; for (i=0; i<NAMESPACE_SIZE; i++) node.namespace_set[i] = -1; if (argc == 3) { // first ring XBT_DEBUG("Hey! Let's create the system."); deadline = xbt_str_parse_double(argv[2], "Invalid deadline: %s"); create(&node); join_success = 1; } else { node.known_id = xbt_str_parse_int(argv[2], "Invalid known ID: %s"); double sleep_time = xbt_str_parse_double(argv[3], "Invalid sleep time: %s"); deadline = xbt_str_parse_double(argv[4], "Invalid deadline: %s"); // sleep before starting XBT_DEBUG("Let's sleep during %f", sleep_time); MSG_process_sleep(sleep_time); XBT_DEBUG("Hey! Let's join the system."); join_success = join(&node); } if (join_success) { XBT_DEBUG("Waiting …."); while (MSG_get_clock() < init_time + deadline // && MSG_get_clock() < node.last_change_date + 1000 && MSG_get_clock() < max_simulation_time) { if (node.comm_receive == NULL) { task_received = NULL; node.comm_receive = MSG_task_irecv(&task_received, node.mailbox); // FIXME: do not make MSG_task_irecv() calls from several functions } if (!MSG_comm_test(node.comm_receive)) { MSG_process_sleep(5); } else { // a transfer has occurred msg_error_t status = MSG_comm_get_status(node.comm_receive); if (status != MSG_OK) { XBT_DEBUG("Failed to receive a task. Nevermind."); MSG_comm_destroy(node.comm_receive); node.comm_receive = NULL; } else { // the task was successfully received MSG_comm_destroy(node.comm_receive); node.comm_receive = NULL; handle_task(&node, task_received); } } } print_node(&node); } return 1; }
/** Receiver function */ int receiver(int argc, char *argv[]) { msg_task_t task = NULL; _XBT_GNUC_UNUSED msg_error_t res; int id = -1; char mailbox[80]; msg_comm_t res_irecv; double sleep_start_time = atof(argv[2]); double sleep_test_time = atof(argv[3]); long senders_count = atol(argv[4]); XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time); int timeout = -1; int timeflag = 1; // set to 1 for no timeout _XBT_GNUC_UNUSED int read; read = sscanf(argv[1], "%d", &id); xbt_assert(read, "Invalid argument %s\n", argv[1]); MSG_process_sleep(sleep_start_time); sprintf(mailbox, "receiver-%d", id); while (1) { res_irecv = MSG_task_irecv(&(task), mailbox); XBT_INFO("Wait to receive a task - sleep_test = %f", sleep_test_time); if (sleep_test_time == 0) { if (MSG_get_clock() >= 3.9 && timeflag == 0) { timeflag = 1; timeout = 0.05; } res = MSG_comm_wait(res_irecv, timeout); //xbt_assert(res == MSG_OK, "MSG_task_get failed"); if (res != MSG_OK) { XBT_INFO("Timeout !!"); timeout = -1; MSG_comm_destroy(res_irecv); continue; } } else { while (MSG_comm_test(res_irecv) == 0) { XBT_INFO("Attente ..."); MSG_process_sleep(sleep_test_time); }; XBT_INFO("comm destroy"); MSG_comm_destroy(res_irecv); } XBT_INFO("Received \"%s\"", MSG_task_get_name(task)); if (!strcmp(MSG_task_get_name(task), "finalize")) { //MSG_task_destroy(task); //task = NULL; senders_count--; if (senders_count == 0) { break; } } else { XBT_INFO("Processing \"%s\"", MSG_task_get_name(task)); MSG_task_execute(task); XBT_INFO("\"%s\" done", MSG_task_get_name(task)); //MSG_task_destroy(task); //task = NULL; } MSG_task_destroy(task); task = NULL; } XBT_INFO("I'm done. See you!"); return 0; } /* end_of_receiver */