summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c894b2b)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7728
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
while ((action = xbt_swag_extract(model->states.done_action_set))) {
smx_action = action->data;
if (smx_action) {
while ((action = xbt_swag_extract(model->states.done_action_set))) {
smx_action = action->data;
if (smx_action) {
- /* Copy the transfered data of the completed communication actions */
- /* FIXME: find a better way to determine if its a comm action */
- if(smx_action->data != NULL)
- SIMIX_network_copy_data((smx_comm_t)smx_action->data);
SIMIX_action_signal_all(smx_action);
}
}
SIMIX_action_signal_all(smx_action);
}
}
THROW0(network_error, 0, "Remote peer failed");
}
THROW0(network_error, 0, "Remote peer failed");
}
+ /* Copy network data */
+ SIMIX_network_copy_data(comm);
+
SIMIX_communication_destroy(comm);
}
SIMIX_communication_destroy(comm);
}
{
size_t buff_size = comm->src_buff_size;
{
size_t buff_size = comm->src_buff_size;
+ /* If there is no data to be copy then return */
+ if(!comm->src_buff || !comm->dst_buff)
+ return;
+
DEBUG6("Copying comm %p data from %s (%p) -> %s (%p) (%zu bytes)",
comm,
comm->src_proc->smx_host->name, comm->src_buff,
comm->dst_proc->smx_host->name, comm->dst_buff,
buff_size);
DEBUG6("Copying comm %p data from %s (%p) -> %s (%p) (%zu bytes)",
comm,
comm->src_proc->smx_host->name, comm->src_buff,
comm->dst_proc->smx_host->name, comm->dst_buff,
buff_size);
- /* If there is no data to be copy then return */
- if(!comm->src_buff || !comm->dst_buff)
- return;
-
/* Copy at most dst_buff_size bytes of the message to receiver's buffer */
if (comm->dst_buff_size)
buff_size = MIN(buff_size,*(comm->dst_buff_size));
/* Copy at most dst_buff_size bytes of the message to receiver's buffer */
if (comm->dst_buff_size)
buff_size = MIN(buff_size,*(comm->dst_buff_size));
return;
(*SIMIX_network_copy_data_callback)(comm, buff_size);
return;
(*SIMIX_network_copy_data_callback)(comm, buff_size);
+ /* Set the buffers to null so we copy data only once */
+ /* (this function might be called from both communication ends)*/
+ comm->src_buff = NULL;
+ comm->dst_buff = NULL;
+
/* pimple to display the message sizes */
{
if (msg_sizes == NULL)
/* pimple to display the message sizes */
{
if (msg_sizes == NULL)
MC_create_transition(mc_test, SIMIX_process_self(), comm->rdv, comm);
SIMIX_process_yield();
}
MC_create_transition(mc_test, SIMIX_process_self(), comm->rdv, comm);
SIMIX_process_yield();
}
- return comm->sem?SIMIX_sem_would_block(comm->sem):0;
+
+ /* Copy data if the communication is done */
+ if(comm->sem && !SIMIX_sem_would_block(comm->sem)){
+ /* Copy network data */
+ SIMIX_network_copy_data(comm);
+ return TRUE;
+ }
+ return FALSE;
}
/** @brief wait for the completion of any communication of a set
}
/** @brief wait for the completion of any communication of a set