void* data);
/* FIXME: waitany is going to be a vararg function, and should take a timeout */
-XBT_PUBLIC unsigned int simcall_comm_waitany(smx_activity_t* comms, size_t count, double timeout);
+XBT_PUBLIC unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double timeout);
XBT_PUBLIC void simcall_comm_wait(const smx_activity_t& comm, double timeout);
XBT_PUBLIC int simcall_comm_test(const smx_activity_t& comm);
XBT_PUBLIC int simcall_comm_testany(smx_activity_t comms[], size_t count);
static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall)
{
- smx_activity_t* synchros = simcall_comm_waitany__get__comms(simcall);
- size_t count = simcall_comm_waitany__get__count(simcall);
+ simgrid::kernel::activity::CommImpl** comms = simcall_comm_waitany__get__comms(simcall);
+ size_t count = simcall_comm_waitany__get__count(simcall);
for (size_t i = 0; i < count; i++) {
// Remove the first occurence of simcall:
- smx_activity_t& synchro = synchros[i];
- auto j = boost::range::find(synchro->simcalls_, simcall);
- if (j != synchro->simcalls_.end())
- synchro->simcalls_.erase(j);
+ auto* comm = comms[i];
+ auto j = boost::range::find(comm->simcalls_, simcall);
+ if (j != comm->simcalls_.end())
+ comm->simcalls_.erase(j);
}
}
-void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, smx_activity_t* synchros, size_t count, double timeout)
+void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count,
+ double timeout)
{
if (MC_is_active() || MC_record_replay_is_active()) {
if (timeout > 0.0)
xbt_die("Timeout not implemented for waitany in the model-checker");
int idx = SIMCALL_GET_MC_VALUE(simcall);
- smx_activity_t& synchro = synchros[idx];
- synchro->simcalls_.push_back(simcall);
+ auto* comm = comms[idx];
+ comm->simcalls_.push_back(simcall);
simcall_comm_waitany__set__result(simcall, idx);
- synchro->state_ = SIMIX_DONE;
- synchro->finish();
+ comm->state_ = SIMIX_DONE;
+ comm->finish();
return;
}
for (size_t i = 0; i < count; i++) {
/* associate this simcall to the the synchro */
- smx_activity_t& synchro = synchros[i];
- synchro->simcalls_.push_back(simcall);
+ auto* comm = comms[i];
+ comm->simcalls_.push_back(simcall);
/* see if the synchro is already finished */
- if (synchro->state_ != SIMIX_WAITING && synchro->state_ != SIMIX_RUNNING) {
- synchro->finish();
+ if (comm->state_ != SIMIX_WAITING && comm->state_ != SIMIX_RUNNING) {
+ comm->finish();
break;
}
}
}
case SIMCALL_COMM_WAITANY: {
- simgrid::kernel::activity::ActivityImpl** comms = simcall_comm_waitany__getraw__comms(req);
- size_t count = simcall_comm_waitany__get__count(req);
+ simgrid::kernel::activity::CommImpl** comms = simcall_comm_waitany__get__comms(req);
+ size_t count = simcall_comm_waitany__get__count(req);
for (unsigned int index = 0; index < count; ++index) {
- simgrid::kernel::activity::CommImpl* comm = static_cast<simgrid::kernel::activity::CommImpl*>(comms[index]);
+ auto* comm = comms[index];
if (comm->src_actor_ && comm->dst_actor_)
return true;
}
type = "WaitAny";
size_t count = simcall_comm_waitany__get__count(req);
if (count > 0) {
- simgrid::kernel::activity::ActivityImpl* remote_sync;
- remote_sync = mc_model_checker->process().read(remote(simcall_comm_waitany__getraw__comms(req) + value));
+ simgrid::kernel::activity::CommImpl* remote_sync;
+ remote_sync = mc_model_checker->process().read(remote(simcall_comm_waitany__get__comms(req) + value));
char* p = pointer_to_string(remote_sync);
args = bprintf("comm=%s (%d of %zu)", p, value + 1, count);
xbt_free(p);
bool request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx)
{
- simgrid::kernel::activity::ActivityImpl* remote_act = nullptr;
+ simgrid::kernel::activity::CommImpl* remote_act = nullptr;
switch (req->call) {
case SIMCALL_COMM_WAIT:
break;
case SIMCALL_COMM_WAITANY:
- remote_act = mc_model_checker->process().read(remote(simcall_comm_testany__getraw__comms(req) + idx));
+ remote_act = mc_model_checker->process().read(remote(simcall_comm_testany__get__comms(req) + idx));
break;
case SIMCALL_COMM_TESTANY:
}
simgrid::mc::Remote<simgrid::kernel::activity::CommImpl> temp_comm;
- mc_model_checker->process().read(temp_comm, remote(static_cast<simgrid::kernel::activity::CommImpl*>(remote_act)));
+ mc_model_checker->process().read(temp_comm, remote(remote_act));
simgrid::kernel::activity::CommImpl* comm = temp_comm.getBuffer();
return comm->src_actor_.get() && comm->dst_actor_.get();
}
switch (req->call) {
case SIMCALL_COMM_WAITANY: {
state->internal_req.call = SIMCALL_COMM_WAIT;
- simgrid::kernel::activity::ActivityImpl* remote_comm;
+ simgrid::kernel::activity::CommImpl* remote_comm;
remote_comm =
- mc_model_checker->process().read(remote(simcall_comm_waitany__getraw__comms(req) + state->transition.argument));
- mc_model_checker->process().read(state->internal_comm,
- remote(static_cast<simgrid::kernel::activity::CommImpl*>(remote_comm)));
+ mc_model_checker->process().read(remote(simcall_comm_waitany__get__comms(req) + state->transition.argument));
+ mc_model_checker->process().read(state->internal_comm, remote(remote_comm));
simcall_comm_wait__set__comm(&state->internal_req, state->internal_comm.getBuffer());
simcall_comm_wait__set__timeout(&state->internal_req, 0);
break;
/**
* @ingroup simix_comm_management
*/
-unsigned int simcall_comm_waitany(smx_activity_t* comms, size_t count, double timeout)
+unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double timeout)
{
- return simcall_BODY_comm_waitany(comms, count, timeout);
+ std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(new simgrid::kernel::activity::CommImpl*[count]);
+ std::transform(comms, comms + count, rcomms.get(), [](const smx_activity_t& comm) {
+ return static_cast<simgrid::kernel::activity::CommImpl*>(comm.get());
+ });
+ return simcall_BODY_comm_waitany(rcomms.get(), count, timeout);
}
/**
if (count == 0)
return -1;
std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(new simgrid::kernel::activity::CommImpl*[count]);
- std::transform(comms, comms + count, rcomms.get(), [](const smx_activity_t comm) {
+ std::transform(comms, comms + count, rcomms.get(), [](const smx_activity_t& comm) {
return static_cast<simgrid::kernel::activity::CommImpl*>(comm.get());
});
return simcall_BODY_comm_testany(rcomms.get(), count);
simgrid::simix::marshal<boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>>(simcall->result, result);
}
-static inline boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>*
-simcall_comm_waitany__get__comms(smx_simcall_t simcall)
+static inline simgrid::kernel::activity::CommImpl** simcall_comm_waitany__get__comms(smx_simcall_t simcall)
{
- return simgrid::simix::unmarshal<boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>*>(simcall->args[0]);
+ return simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall->args[0]);
}
-static inline simgrid::kernel::activity::ActivityImpl** simcall_comm_waitany__getraw__comms(smx_simcall_t simcall)
+static inline simgrid::kernel::activity::CommImpl** simcall_comm_waitany__getraw__comms(smx_simcall_t simcall)
{
- return simgrid::simix::unmarshal_raw<simgrid::kernel::activity::ActivityImpl**>(simcall->args[0]);
+ return simgrid::simix::unmarshal_raw<simgrid::kernel::activity::CommImpl**>(simcall->args[0]);
}
-static inline void simcall_comm_waitany__set__comms(smx_simcall_t simcall,
- boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>* arg)
+static inline void simcall_comm_waitany__set__comms(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** arg)
{
- simgrid::simix::marshal<boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>*>(simcall->args[0], arg);
+ simgrid::simix::marshal<simgrid::kernel::activity::CommImpl**>(simcall->args[0], arg);
}
static inline size_t simcall_comm_waitany__get__count(smx_simcall_t simcall)
{
XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, int detached);
XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate);
XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate);
-XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall,
- boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>* comms,
+XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms,
size_t count, double timeout);
XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm,
double timeout);
return simcall<boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>, smx_actor_t, smx_mailbox_t, void*, size_t*, simix_match_func_t, simix_copy_data_func_t, void*, double>(SIMCALL_COMM_IRECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate);
}
-inline static int simcall_BODY_comm_waitany(boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>* comms,
- size_t count, double timeout)
+inline static int simcall_BODY_comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout)
{
if (0) /* Go to that function to follow the code flow through the simcall barrier */
simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall, comms, count, timeout);
- return simcall<int, boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>*, size_t, double>(
- SIMCALL_COMM_WAITANY, comms, count, timeout);
+ return simcall<int, simgrid::kernel::activity::CommImpl**, size_t, double>(SIMCALL_COMM_WAITANY, comms, count,
+ timeout);
}
inline static void simcall_BODY_comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout)
case SIMCALL_COMM_WAITANY:
simcall_HANDLER_comm_waitany(
- simcall,
- simgrid::simix::unmarshal<boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>*>(simcall->args[0]),
+ simcall, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall->args[0]),
simgrid::simix::unmarshal<size_t>(simcall->args[1]), simgrid::simix::unmarshal<double>(simcall->args[2]));
break;
boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, int detached);
void comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate) [[block]];
boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate);
-int comm_waitany(boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl>* comms, size_t count, double timeout) [[block]];
+int comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
void comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout) [[block]];
int comm_test(simgrid::kernel::activity::CommImpl* comm) [[block]];
int comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count) [[block]];