- const auto IRECV = Simcall::COMM_IRECV;
- const auto ISEND = Simcall::COMM_ISEND;
- const auto TEST = Simcall::COMM_TEST;
- const auto WAIT = Simcall::COMM_WAIT;
-
- if (req1->issuer_ == req2->issuer_)
- return false;
-
- /* The independence theorem only consider 4 simcalls. All others are dependent with anything. */
- if (req1->call_ != ISEND && req1->call_ != IRECV && req1->call_ != TEST && req1->call_ != WAIT)
- return true;
- if (req2->call_ != ISEND && req2->call_ != IRECV && req2->call_ != TEST && req2->call_ != WAIT)
- return true;
-
- /* Timeouts in wait transitions are not considered by the independence theorem, thus assumed dependent */
- if ((req1->call_ == WAIT && simcall_comm_wait__get__timeout(req1) > 0) ||
- (req2->call_ == WAIT && simcall_comm_wait__get__timeout(req2) > 0))
- return true;
-
- /* Make sure that req1 and req2 are in alphabetic order */
- if (req1->call_ > req2->call_) {
- auto temp = req1;
- req1 = req2;
- req2 = temp;
- }
-
- auto comm1 = get_comm_or_nullptr(req1);
- auto comm2 = get_comm_or_nullptr(req2);
-
- /* First case: that's not the same kind of request (we also know that req1 < req2 alphabetically) */
- if (req1->call_ != req2->call_) {
- if (req1->call_ == IRECV && req2->call_ == ISEND)
- return false;
-
- if ((req1->call_ == IRECV || req1->call_ == ISEND) && req2->call_ == WAIT) {
- auto mbox1 = get_mbox_remote_addr(req1);
- auto mbox2 = remote(comm2->mbox_cpy);
-
- if (mbox1 != mbox2 && simcall_comm_wait__get__timeout(req2) <= 0)
- return false;
-
- if ((req1->issuer_ != comm2->src_actor_.get()) && (req1->issuer_ != comm2->dst_actor_.get()) &&
- simcall_comm_wait__get__timeout(req2) <= 0)
- return false;
-
- if ((req1->call_ == ISEND) && (comm2->type_ == kernel::activity::CommImpl::Type::SEND) &&
- (comm2->src_buff_ != simcall_comm_isend__get__src_buff(req1)) && simcall_comm_wait__get__timeout(req2) <= 0)
- return false;
-
- if ((req1->call_ == IRECV) && (comm2->type_ == kernel::activity::CommImpl::Type::RECEIVE) &&
- (comm2->dst_buff_ != simcall_comm_irecv__get__dst_buff(req1)) && simcall_comm_wait__get__timeout(req2) <= 0)
- return false;
- }
-
- /* FIXME: the following rule assumes that the result of the isend/irecv call is not stored in a buffer used in the
- * test call. */
-#if 0
- if((req1->call == ISEND || req1->call == IRECV)
- && req2->call == TEST)
- return false;
-#endif
-
- if (req1->call_ == TEST && req2->call_ == WAIT &&
- (comm1->src_actor_.get() == nullptr || comm1->dst_actor_.get() == nullptr))
- return false;
-
- if (req1->call_ == TEST &&
- (simcall_comm_test__get__comm(req1) == nullptr || comm1->src_buff_ == nullptr || comm1->dst_buff_ == nullptr))
- return false;
- if (req2->call_ == TEST &&
- (simcall_comm_test__get__comm(req2) == nullptr || comm2->src_buff_ == nullptr || comm2->dst_buff_ == nullptr))
- return false;
-
- if (req1->call_ == TEST && req2->call_ == WAIT && comm1->src_buff_ == comm2->src_buff_ &&
- comm1->dst_buff_ == comm2->dst_buff_)
- return false;
-
- if (req1->call_ == TEST && req2->call_ == WAIT && comm1->src_buff_ != nullptr && comm1->dst_buff_ != nullptr &&
- comm2->src_buff_ != nullptr && comm2->dst_buff_ != nullptr && comm1->dst_buff_ != comm2->src_buff_ &&
- comm1->dst_buff_ != comm2->dst_buff_ && comm2->dst_buff_ != comm1->src_buff_)
- return false;
-
- return true;
- }