}
for (std::size_t i = 0; i != count; ++i) {
- simgrid::kernel::activity::ActivityImplPtr comm = comms[i];
+ simgrid::kernel::activity::CommImpl* comm = comms[i];
if (comm->state_ != SIMIX_WAITING && comm->state_ != SIMIX_RUNNING) {
simcall_comm_testany__set__result(simcall, i);
comm->simcalls_.push_back(simcall);
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;
}
}
CommImpl::~CommImpl()
{
- XBT_DEBUG("Really free communication %p", this);
+ XBT_DEBUG("Really free communication %p in state %d (detached = %d)", this, static_cast<int>(state_),
+ static_cast<int>(detached));
cleanupSurf();
if (clean_fun)
clean_fun(src_buff_);
src_buff_ = nullptr;
- }
-
- if (mbox)
+ } else if (mbox) {
mbox->remove(this);
+ }
}
/** @brief Starts the simulation of a communication synchro. */
{
/* if the synchro is a waiting state means that it is still in a mbox so remove from it and delete it */
if (state_ == SIMIX_WAITING) {
- mbox->remove(this);
- state_ = SIMIX_CANCELED;
+ if (not detached) {
+ mbox->remove(this);
+ state_ = SIMIX_CANCELED;
+ }
} else if (not MC_is_active() /* when running the MC there are no surf actions */
&& not MC_record_replay_is_active() && (state_ == SIMIX_READY || state_ == SIMIX_RUNNING)) {
surf_action_->cancel();