/* Pimple to get an histogram of message sizes in the simulation */
xbt_dict_t msg_sizes = NULL;
+xbt_dict_t latency_limited_dict = NULL;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix,
"Logging specific to SIMIX (network)");
void SIMIX_communication_destroy(smx_comm_t comm)
{
VERB2("Destroy communication %p; refcount initially %d",comm,comm->refcount);
+
+ //save is latency limited flag to use afterwards
+ if (latency_limited_dict == NULL) {
+ latency_limited_dict = xbt_dict_new();
+ }
+ if (comm->act){
+ DEBUG2("adding key %p with latency limited value %d to the dict", comm, SIMIX_action_is_latency_bounded(comm->act));
+ xbt_dicti_set(latency_limited_dict, (uintptr_t)comm, SIMIX_action_is_latency_bounded(comm->act));
+ }
+
comm->refcount--;
if(comm->refcount > 0)
return;
comm->dst_timeout = NULL;
}
+
+
xbt_free(comm);
}
if (!SIMIX_host_get_state(SIMIX_host_self())){
if(comm->rdv)
SIMIX_rdv_remove(comm->rdv, comm);
- SIMIX_communication_destroy(comm);
+ SIMIX_communication_destroy(comm);
THROW0(host_error, 0, "Host failed");
} else if (SIMIX_action_get_state(comm->act) == SURF_ACTION_FAILED){
SIMIX_communication_destroy(comm);
*/
XBT_INLINE double SIMIX_communication_get_remains(smx_comm_t comm)
{
+ DEBUG1("calling SIMIX_action_get_remains(%p)", comm->act);
return SIMIX_action_get_remains(comm->act);
}
+/**
+ * \brief verify if communication is latency bounded
+ * \param comm The communication
+ */
+XBT_INLINE int SIMIX_communication_is_latency_bounded(smx_comm_t comm)
+{
+ //try to find comm on the list of finished flows
+ uintptr_t key = 0;
+ uintptr_t data = 0;
+ xbt_dict_cursor_t cursor;
+ xbt_dict_foreach(latency_limited_dict,cursor,key,data) {
+ DEBUG2("comparing key=%p with comm=%p", (void*)key, (void*)comm);
+ if((void*)comm == (void*)key){
+ DEBUG2("key %p found, return value latency limited value %d", (void*)key, (int)data);
+ return (int)data;
+ }
+ }
+
+ DEBUG1("calling SIMIX_action_is_latency_bounded(%p)", comm->act);
+ return SIMIX_action_is_latency_bounded(comm->act);
+}
+
/******************************************************************************/
/* SIMIX_network_copy_data callbacks */
/******************************************************************************/
{
return comm->dst_buff;
}
-XBT_PUBLIC(void *) SIMIX_communication_get_src_buf_size(smx_comm_t comm)
+XBT_PUBLIC(size_t) SIMIX_communication_get_src_buf_size(smx_comm_t comm)
{
return comm->src_buff_size;
}
-XBT_PUBLIC(void *) SIMIX_communication_get_dst_buf_size(smx_comm_t comm)
+XBT_PUBLIC(size_t) SIMIX_communication_get_dst_buf_size(smx_comm_t comm)
{
- return comm->dst_buff_size;
+ return *(comm->dst_buff_size);
}
/******************************************************************************/
XBT_INLINE void SIMIX_network_recv(smx_rdv_t rdv, double timeout, void *dst_buff,
size_t *dst_buff_size, smx_comm_t *comm_ref)
{
- *comm_ref = SIMIX_network_irecv(rdv,dst_buff,dst_buff_size);
+ *comm_ref = (smx_comm_t) SIMIX_network_irecv(rdv,dst_buff,dst_buff_size);
SIMIX_network_wait(*comm_ref,timeout);
}