X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/6d4707a65e4e27048bc5cb33f8db62fdb1b958a3..5a4a8663668a3af89fe7c4026d08f3e0fb144f05:/communicator.cpp?ds=sidebyside diff --git a/communicator.cpp b/communicator.cpp index 0f9bc7e..7784a48 100644 --- a/communicator.cpp +++ b/communicator.cpp @@ -9,6 +9,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(comm); #include "misc.h" #include "options.h" +#include "tracing.h" #include "communicator.h" @@ -21,13 +22,10 @@ std::string message::to_string() return oss.str(); } -int communicator::send_count_before_flush = 4; - communicator::communicator() : host((hostdata* )MSG_host_get_data(MSG_host_self())) , mutex(xbt_mutex_init()) , cond(xbt_cond_init()) - , send_counter(0) , ctrl_task(NULL) , ctrl_comm(NULL) , data_task(NULL) @@ -37,6 +35,7 @@ communicator::communicator() receiver_process = MSG_process_create("receiver", communicator::receiver_wrapper, this, MSG_host_self()); + xbt_cond_wait(cond, mutex); // wait for the receiver to be ready xbt_mutex_release(mutex); } @@ -81,22 +80,33 @@ void communicator::send(const char* dest, message* msg) if (msg->get_type() == message::LOAD) msg_size += opt::comm_cost(msg->get_amount()); m_task_t task = MSG_task_create("message", 0.0, msg_size, msg); + TRACE_msg_set_task_category(task, + msg->get_type() == message::LOAD ? + TRACE_CAT_DATA : TRACE_CAT_CTRL); msg_comm_t comm = MSG_task_isend(task, dest); sent_comm.push_back(comm); - - if (++send_counter >= send_count_before_flush) { - flush(false); - send_counter = 0; - } } -bool communicator::recv(message*& msg, m_host_t& from, bool wait) +bool communicator::recv(message*& msg, m_host_t& from, double timeout) { - if (wait) { + if (timeout != 0) { + volatile double deadline = + timeout > 0 ? MSG_get_clock() + timeout : 0.0; xbt_mutex_acquire(mutex); - while (received.empty()) { + while (received.empty() && (!deadline || deadline > MSG_get_clock())) { + xbt_ex_t e; DEBUG0("waiting for a message to come"); - xbt_cond_wait(cond, mutex); + TRY { + if (deadline) + xbt_cond_timedwait(cond, mutex, deadline - MSG_get_clock()); + else + xbt_cond_wait(cond, mutex); + } + CATCH (e) { + if (e.category != timeout_error) + RETHROW; + xbt_ex_free(e); + } } xbt_mutex_release(mutex); } @@ -164,6 +174,11 @@ int communicator::receiver() { ctrl_comm = MSG_task_irecv(&ctrl_task, get_ctrl_mbox()); data_comm = MSG_task_irecv(&data_task, get_data_mbox()); + DEBUG0("receiver ready"); + xbt_mutex_acquire(mutex); + xbt_cond_signal(cond); // signal master that we are ready + xbt_mutex_release(mutex); + xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL); while (ctrl_comm || data_comm) { @@ -177,7 +192,9 @@ int communicator::receiver() if (ctrl_comm && comm_test_n_destroy(ctrl_comm)) { if (strcmp(MSG_task_get_name(ctrl_task), "finalize")) { DEBUG0("received message from ctrl"); + xbt_mutex_acquire(mutex); received.push(ctrl_task); + xbt_mutex_release(mutex); ctrl_task = NULL; ctrl_comm = MSG_task_irecv(&ctrl_task, get_ctrl_mbox()); } else { @@ -191,7 +208,9 @@ int communicator::receiver() if (data_comm && comm_test_n_destroy(data_comm)) { if (strcmp(MSG_task_get_name(data_task), "finalize")) { DEBUG0("received message from data"); + xbt_mutex_acquire(mutex); received.push(data_task); + xbt_mutex_release(mutex); data_task = NULL; data_comm = MSG_task_irecv(&data_task, get_data_mbox()); } else { @@ -202,7 +221,8 @@ int communicator::receiver() } } xbt_mutex_acquire(mutex); - xbt_cond_signal(cond); + if (!received.empty()) + xbt_cond_signal(cond); xbt_mutex_release(mutex); } xbt_dynar_free(&comms);