-int communicator::receiver_wrapper(int, char* [])
-{
- communicator* comm;
- comm = static_cast<communicator*>(MSG_process_get_data(MSG_process_self()));
- int result = comm->receiver();
-
- DEBUG0("terminate");
- xbt_mutex_acquire(comm->mutex);
- comm->receiver_process = NULL;
- xbt_cond_signal(comm->cond);
- xbt_mutex_release(comm->mutex);
-
- return result;
-}
-
-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) {
-
- if (ctrl_comm)
- xbt_dynar_push(comms, &ctrl_comm);
- if (data_comm)
- xbt_dynar_push(comms, &data_comm);
- MSG_comm_waitany(comms);
- xbt_dynar_reset(comms);
-
- 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 {
- DEBUG0("received finalize from ctrl");
- MSG_task_destroy(ctrl_task);
- ctrl_task = NULL;
- ctrl_comm = NULL;
- }
- }
-
- 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 {
- DEBUG0("received finalize from data");
- MSG_task_destroy(data_task);
- data_task = NULL;
- data_comm = NULL;
- }
- }
- xbt_mutex_acquire(mutex);
- if (!received.empty())
- xbt_cond_signal(cond);
- xbt_mutex_release(mutex);
- }
- xbt_dynar_free(&comms);
- return 0;
-}
-