/* Getters and setters */
XBT_PUBLIC(double) SIMIX_req_comm_get_remains(smx_action_t comm);
XBT_PUBLIC(e_smx_state_t) SIMIX_req_comm_get_state(smx_action_t comm);
-XBT_PUBLIC(void *) SIMIX_req_comm_get_data(smx_action_t comm);
+XBT_PUBLIC(void *) SIMIX_req_comm_get_src_data(smx_action_t comm);
+XBT_PUBLIC(void *) SIMIX_req_comm_get_dst_data(smx_action_t comm);
XBT_PUBLIC(void *) SIMIX_req_comm_get_src_buff(smx_action_t comm);
XBT_PUBLIC(void *) SIMIX_req_comm_get_dst_buff(smx_action_t comm);
XBT_PUBLIC(size_t) SIMIX_req_comm_get_src_buff_size(smx_action_t comm);
/* retrieve the message sent in that communication */
xbt_dynar_get_cpy(comms, got, &(comm));
- msg = SIMIX_req_comm_get_data(comm);
+ msg = SIMIX_req_comm_get_src_data(comm);
sock = xbt_dynar_get_as(trp_proc->sockets, got, gras_socket_t);
sock_data = (gras_trp_sg_sock_data_t) sock->data;
VERB3("Got something. Communication %p's over rdv_server=%p, rdv_client=%p",
if (!comm)
return NULL;
- return (m_task_t) SIMIX_req_comm_get_data(comm);
+ return (m_task_t) SIMIX_req_comm_get_src_data(comm);
}
int
e_smx_state_t SIMIX_comm_get_state(smx_action_t action);
void SIMIX_comm_suspend(smx_action_t action);
void SIMIX_comm_resume(smx_action_t action);
-void* SIMIX_comm_get_data(smx_action_t action);
+void* SIMIX_comm_get_src_data(smx_action_t action);
+void* SIMIX_comm_get_dst_data(smx_action_t action);
void* SIMIX_comm_get_src_buff(smx_action_t action);
void* SIMIX_comm_get_dst_buff(smx_action_t action);
size_t SIMIX_comm_get_src_buff_size(smx_action_t action);
size_t *dst_buff_size;
char copied;
- void *data; /* User data associated to communication */
+ void* src_data; /* User data associated to communication */
+ void* dst_data;
} comm;
struct {
REQ_COMM_TESTANY,
REQ_COMM_GET_REMAINS,
REQ_COMM_GET_STATE,
- REQ_COMM_GET_DATA,
+ REQ_COMM_GET_SRC_DATA,
+ REQ_COMM_GET_DST_DATA,
REQ_COMM_GET_SRC_BUFF,
REQ_COMM_GET_DST_BUFF,
REQ_COMM_GET_SRC_BUFF_SIZE,
struct {
smx_action_t comm;
- void *result;
- } comm_get_data;
+ void *result;
+ } comm_get_src_data;
+
+ struct {
+ smx_action_t comm;
+ void *result;
+ } comm_get_dst_data;
struct {
smx_action_t comm;
{
smx_action_t req;
xbt_fifo_item_t item;
+ void* req_data = NULL;
xbt_fifo_foreach(rdv->comm_fifo, item, req, smx_action_t){
- if(req->comm.type == type && (!match_fun || match_fun(data, req->comm.data))){
- xbt_fifo_remove_item(rdv->comm_fifo, item);
- req->comm.refcount++;
- req->comm.rdv = NULL;
- return req;
- }
+ if(req->comm.type == SIMIX_COMM_SEND) {
+ req_data = req->comm.src_data;
+ } else if(req->comm.type == SIMIX_COMM_RECEIVE) {
+ req_data = req->comm.dst_data;
+ }
+ if(req->comm.type == type && (!match_fun || match_fun(data, req_data))) {
+ xbt_fifo_remove_item(rdv->comm_fifo, item);
+ req->comm.refcount++;
+ req->comm.rdv = NULL;
+ return req;
+ }
}
-
DEBUG0("Communication request not found");
return NULL;
}
action->comm.rate = rate;
action->comm.src_buff = src_buff;
action->comm.src_buff_size = src_buff_size;
- action->comm.data = data;
+ action->comm.src_data = data;
if (MC_IS_ENABLED) {
action->state = SIMIX_RUNNING;
action->comm.dst_proc = dst_proc;
action->comm.dst_buff = dst_buff;
action->comm.dst_buff_size = dst_buff_size;
+ action->comm.dst_data = data;
if (MC_IS_ENABLED) {
action->state = SIMIX_RUNNING;
}
/**
- * \brief Return the user data associated to the communication
+ * \brief Return the user data associated to the sender of the communication
+ * \param action The communication
+ * \return the user data
+ */
+void* SIMIX_comm_get_src_data(smx_action_t action)
+{
+ return action->comm.src_data;
+}
+
+/**
+ * \brief Return the user data associated to the receiver of the communication
* \param action The communication
* \return the user data
*/
-void* SIMIX_comm_get_data(smx_action_t action)
+void* SIMIX_comm_get_dst_data(smx_action_t action)
{
- return action->comm.data;
+ return action->comm.dst_data;
}
void* SIMIX_comm_get_src_buff(smx_action_t action)
SIMIX_request_answer(req);
break;
- case REQ_COMM_GET_DATA:
- req->comm_get_data.result = SIMIX_comm_get_data(req->comm_get_data.comm);
+ case REQ_COMM_GET_SRC_DATA:
+ req->comm_get_src_data.result = SIMIX_comm_get_src_data(req->comm_get_src_data.comm);
+ SIMIX_request_answer(req);
+ break;
+
+ case REQ_COMM_GET_DST_DATA:
+ req->comm_get_dst_data.result = SIMIX_comm_get_dst_data(req->comm_get_dst_data.comm);
SIMIX_request_answer(req);
break;
return req.comm_get_state.result;
}
-void *SIMIX_req_comm_get_data(smx_action_t comm)
+void *SIMIX_req_comm_get_src_data(smx_action_t comm)
{
s_smx_req_t req;
- req.call = REQ_COMM_GET_DATA;
- req.comm_get_data.comm = comm;
+ req.call = REQ_COMM_GET_SRC_DATA;
+ req.comm_get_src_data.comm = comm;
SIMIX_request_push(&req);
- return req.comm_get_data.result;
+ return req.comm_get_src_data.result;
+}
+
+void *SIMIX_req_comm_get_dst_data(smx_action_t comm)
+{
+ s_smx_req_t req;
+
+ req.call = REQ_COMM_GET_DST_DATA;
+ req.comm_get_dst_data.comm = comm;
+
+ SIMIX_request_push(&req);
+ return req.comm_get_dst_data.result;
}
void *SIMIX_req_comm_get_src_buff(smx_action_t comm)