xbt_dynar_get_cpy(comms, got, &(comm));
msg = SIMIX_communication_get_data(comm);
VERB1("Got something. Communication %p's over", comm);
+ SIMIX_communication_destroy(comm);
/* Reinstall a waiting communication on that rdv */
/* Get the sock again
start_time = MSG_get_clock();
#endif
- memset(&comm, 0, sizeof(comm));
-
/* Kept for compatibility with older implementation */
xbt_assert1(!MSG_mailbox_get_cond(mailbox),
"A process is already blocked on this channel %s",
{
xbt_ex_t e;
MSG_error_t ret = MSG_OK;
+ smx_comm_t comm;
simdata_task_t t_simdata = NULL;
m_process_t process = MSG_process_self();
#ifdef HAVE_TRACING
SIMIX_network_send(mailbox->rdv, t_simdata->message_size,
t_simdata->rate, timeout, task, sizeof(void *),
- &t_simdata->comm, task);
+ &comm, task);
}
CATCH(e) {
void *src_buff, size_t src_buff_size,
smx_comm_t * comm_ref, void *data)
{
+ xbt_ex_t e;
*comm_ref =
SIMIX_network_isend(rdv, task_size, rate, src_buff, src_buff_size,
data);
- SIMIX_network_wait(*comm_ref, timeout);
+ TRY {
+ SIMIX_network_wait(*comm_ref, timeout);
+ }
+ TRY_CLEANUP {
+ SIMIX_communication_destroy(*comm_ref);
+ }
+ CATCH(e) {
+ RETHROW;
+ }
}
/**
void *dst_buff, size_t * dst_buff_size,
smx_comm_t * comm_ref)
{
+ xbt_ex_t e;
*comm_ref =
(smx_comm_t) SIMIX_network_irecv(rdv, dst_buff, dst_buff_size);
- SIMIX_network_wait(*comm_ref, timeout);
+ TRY {
+ SIMIX_network_wait(*comm_ref, timeout);
+ }
+ TRY_CLEANUP {
+ SIMIX_communication_destroy(*comm_ref);
+ }
+ CATCH(e) {
+ RETHROW;
+ }
}
/******************************************************************************/
if (_surf_do_model_check)
MC_trans_intercept_wait(comm);
#endif
+ SIMIX_communication_use(comm);
/* Wait for communication completion */
SIMIX_communication_wait_for_completion(comm, timeout);
}
/* let the regular code deal with the communication end (errors checking and cleanup).
* A bit of useless work will be done, but that's good for source factorization */
SIMIX_sem_release_forever(comm_finished->sem);
+ SIMIX_communication_use(comm_finished);
SIMIX_communication_wait_for_completion(comm_finished, -1);
return found_comm;
}
status->MPI_ERROR = MPI_SUCCESS;
status->count = SIMIX_communication_get_dst_buf_size((*request)->pair);
}
+ SIMIX_communication_destroy((*request)->pair);
print_request("finishing wait", *request);
if ((*request)->complete == 1) {
SIMIX_rdv_destroy((*request)->rdv);