std::unique_ptr<State> state = std::move(stack_.back());
stack_.pop_back();
if (reductionMode_ == ReductionMode::dpor) {
- smx_simcall_t req = &state->internal_req_;
- // FIXME: need something less ugly than this substring search
- if (req->call_ == simix::Simcall::MUTEX_LOCK ||
- (req->observer_ &&
- api::get().request_to_string(req, 0, RequestType::internal).find("Mutex") != std::string::npos))
+ auto call = state->executed_req_.call_;
+ const kernel::actor::ActorImpl* issuer = api::get().simcall_get_issuer(&state->executed_req_);
- if (call == simix::Simcall::MUTEX_LOCK || call == simix::Simcall::MUTEX_TRYLOCK)
++ if (call == simix::Simcall::MUTEX_LOCK)
xbt_die("Mutex is currently not supported with DPOR, use --cfg=model-check/reduction:none");
- const kernel::actor::ActorImpl* issuer = api::get().simcall_get_issuer(req);
for (auto i = stack_.rbegin(); i != stack_.rend(); ++i) {
State* prev_state = i->get();
- if (api::get().simcall_check_dependency(req, &prev_state->internal_req_)) {
+ if (state->executed_req_.issuer_ == prev_state->executed_req_.issuer_) {
+ XBT_DEBUG("Simcall %s and %s with same issuer", SIMIX_simcall_name(call),
+ SIMIX_simcall_name(prev_state->executed_req_.call_));
+ break;
+ } else if (api::get().simcall_check_dependency(&state->internal_req_, &prev_state->internal_req_)) {
if (XBT_LOG_ISENABLED(mc_safety, xbt_log_priority_debug)) {
XBT_DEBUG("Dependent Transitions:");
int value = prev_state->transition_.times_considered_;