X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/00e8231fa94528961cddaa1fe35e232de5438e76..8a7a5f10297e28c98d9c77e2985e96627a43e95e:/src/simix/smx_network.c diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index bc09a3e34b..a5868d1fdd 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -219,8 +219,11 @@ void SIMIX_comm_destroy(smx_action_t action) SIMIX_comm_destroy_internal_actions(action); - if(action->comm.detached) - ((void_f_pvoid_t)action->comm.src_data)(action->comm.src_buff); + if (action->comm.detached && action->state != SIMIX_DONE) { + /* the communication has failed and was detached: + * we have to free the buffer */ + ((void_f_pvoid_t) action->comm.src_data)(action->comm.src_buff); + } xbt_free(action); } @@ -505,6 +508,7 @@ static XBT_INLINE void SIMIX_comm_start(smx_action_t action) void SIMIX_comm_finish(smx_action_t action) { + unsigned int destroy_count = 0; smx_req_t req; while ((req = xbt_fifo_shift(action->request_list))) { @@ -603,7 +607,11 @@ void SIMIX_comm_finish(smx_action_t action) req->issuer->waiting_action = NULL; SIMIX_request_answer(req); + destroy_count++; } + + while(destroy_count-- > 0) + SIMIX_comm_destroy(action); } void SIMIX_post_comm(smx_action_t action)