Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Simcall COMM_TESTANY is not blocking either. Simplify.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 12 Apr 2021 09:01:11 +0000 (11:01 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 12 Apr 2021 09:15:47 +0000 (11:15 +0200)
src/kernel/activity/CommImpl.cpp
src/simix/popping_accessors.hpp
src/simix/popping_generated.cpp
src/simix/simcalls.in

index 3e80008..5b5582c 100644 (file)
@@ -228,37 +228,19 @@ bool simcall_HANDLER_comm_test(smx_simcall_t, simgrid::kernel::activity::CommImp
   return comm->test();
 }
 
-void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count)
+int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count)
 {
-  // The default result is -1 -- this means, "nothing is ready".
-  // It can be changed below, but only if something matches.
-  simcall_comm_testany__set__result(simcall, -1);
-
   if (MC_is_active() || MC_record_replay_is_active()) {
     int idx = simcall->mc_value_;
-    if (idx == -1) {
-      simcall->issuer_->simcall_answer();
-    } else {
-      simgrid::kernel::activity::CommImpl* comm = comms[idx];
-      simcall_comm_testany__set__result(simcall, idx);
-      comm->simcalls_.push_back(simcall);
-      comm->state_ = simgrid::kernel::activity::State::DONE;
-      comm->finish();
-    }
-    return;
+    xbt_assert(idx == -1 || comms[idx]->test());
+    return idx;
   }
 
   for (std::size_t i = 0; i != count; ++i) {
-    simgrid::kernel::activity::CommImpl* comm = comms[i];
-    if (comm->state_ != simgrid::kernel::activity::State::WAITING &&
-        comm->state_ != simgrid::kernel::activity::State::RUNNING) {
-      simcall_comm_testany__set__result(simcall, i);
-      comm->simcalls_.push_back(simcall);
-      comm->finish();
-      return;
-    }
+    if (comms[i]->test())
+      return i;
   }
-  simcall->issuer_->simcall_answer();
+  return -1;
 }
 
 static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall)
index 0f878b0..78757f9 100644 (file)
@@ -668,6 +668,6 @@ XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcal
 XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout);
 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, unsigned char* 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, bool detached);
 XBT_PRIVATE bool simcall_HANDLER_comm_test(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm);
-XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
+XBT_PRIVATE int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
 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);
index 36c4db8..3a736cb 100644 (file)
@@ -79,7 +79,8 @@ void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered)
       break;
 
     case Simcall::COMM_TESTANY:
-      simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1]));
+      simgrid::simix::marshal<int>(simcall_.result_, simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1])));
+      simcall_answer();
       break;
 
     case Simcall::COMM_WAITANY:
index e745724..5571691 100644 (file)
@@ -40,7 +40,7 @@ boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_irecv(smx_act
 void           comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) [[block]];
 boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* 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, bool detached);
 bool           comm_test(simgrid::kernel::activity::CommImpl* comm);
-int            comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count) [[block]];
+int            comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count);
 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]];