Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make simcall execution_waitany_for use a std::vector internally.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 17 Mar 2021 21:47:10 +0000 (22:47 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 18 Mar 2021 09:24:53 +0000 (10:24 +0100)
src/kernel/activity/ExecImpl.cpp
src/simix/libsmx.cpp
src/simix/popping_accessors.hpp
src/simix/popping_bodies.cpp
src/simix/popping_generated.cpp
src/simix/simcalls.in

index 0f925c9..75cf11e 100644 (file)
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
 
-void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl* execs[],
-                                           size_t count, double timeout)
+void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall,
+                                           const std::vector<simgrid::kernel::activity::ExecImpl*>* execs,
+                                           double timeout)
 {
   if (timeout < 0.0) {
     simcall->timeout_cb_ = nullptr;
   } else {
-    simcall->timeout_cb_ = simgrid::simix::Timer::set(SIMIX_get_clock() + timeout, [simcall, execs, count]() {
+    simcall->timeout_cb_ = simgrid::simix::Timer::set(SIMIX_get_clock() + timeout, [simcall, execs]() {
       simcall->timeout_cb_ = nullptr;
-      for (size_t i = 0; i < count; i++) {
+      for (auto* exec : *execs) {
         // Remove the first occurrence of simcall:
-        auto* exec = execs[i];
-        auto j     = boost::range::find(exec->simcalls_, simcall);
+        auto j = boost::range::find(exec->simcalls_, simcall);
         if (j != exec->simcalls_.end())
           exec->simcalls_.erase(j);
       }
@@ -39,9 +39,8 @@ void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, simgrid::kerne
     });
   }
 
-  for (size_t i = 0; i < count; i++) {
+  for (auto* exec : *execs) {
     /* associate this simcall to the the synchro */
-    auto* exec = execs[i];
     exec->simcalls_.push_back(simcall);
 
     /* see if the synchro is already finished */
@@ -201,13 +200,12 @@ void ExecImpl::finish()
     if (simcall->call_ == simix::Simcall::NONE) // FIXME: maybe a better way to handle this case
       continue;                                 // if process handling comm is killed
     if (simcall->call_ == simix::Simcall::EXECUTION_WAITANY_FOR) {
-      simgrid::kernel::activity::ExecImpl** execs = simcall_execution_waitany_for__get__execs(simcall);
-      size_t count                                = simcall_execution_waitany_for__get__count(simcall);
+      const std::vector<simgrid::kernel::activity::ExecImpl*>* execs =
+          simcall_execution_waitany_for__get__execs(simcall);
 
-      for (size_t i = 0; i < count; i++) {
+      for (auto* exec : *execs) {
         // Remove the first occurrence of simcall:
-        auto* exec = execs[i];
-        auto j     = boost::range::find(exec->simcalls_, simcall);
+        auto j = boost::range::find(exec->simcalls_, simcall);
         if (j != exec->simcalls_.end())
           exec->simcalls_.erase(j);
 
@@ -218,8 +216,8 @@ void ExecImpl::finish()
       }
 
       if (not MC_is_active() && not MC_record_replay_is_active()) {
-        ExecImpl** element = std::find(execs, execs + count, this);
-        int rank           = (element != execs + count) ? element - execs : -1;
+        auto element = std::find(execs->begin(), execs->end(), this);
+        int rank     = (element != execs->end()) ? std::distance(execs->begin(), element) : -1;
         simcall_execution_waitany_for__set__result(simcall, rank);
       }
     }
index 16e7f8f..4dcfc05 100644 (file)
@@ -62,7 +62,8 @@ bool simcall_execution_test(const simgrid::kernel::activity::ActivityImplPtr& ex
 
 unsigned int simcall_execution_waitany_for(simgrid::kernel::activity::ExecImpl* execs[], size_t count, double timeout)
 {
-  return simcall_BODY_execution_waitany_for(execs, count, timeout);
+  std::vector<simgrid::kernel::activity::ExecImpl*> execsv(execs, execs + count);
+  return simcall_BODY_execution_waitany_for(&execsv, timeout);
 }
 
 void simcall_process_join(smx_actor_t process, double timeout) // XBT_ATTRIB_DEPRECATED_v328
index db744d4..90b307e 100644 (file)
  */
 
 #include "src/simix/popping_private.hpp"
-static inline simgrid::kernel::activity::ExecImpl** simcall_execution_waitany_for__get__execs(smx_simcall_t simcall)
+static inline const std::vector<simgrid::kernel::activity::ExecImpl*>* simcall_execution_waitany_for__get__execs(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal<simgrid::kernel::activity::ExecImpl**>(simcall->args_[0]);
+  return simgrid::simix::unmarshal<const std::vector<simgrid::kernel::activity::ExecImpl*>*>(simcall->args_[0]);
 }
-static inline simgrid::kernel::activity::ExecImpl** simcall_execution_waitany_for__getraw__execs(smx_simcall_t simcall)
+static inline const std::vector<simgrid::kernel::activity::ExecImpl*>* simcall_execution_waitany_for__getraw__execs(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal_raw<simgrid::kernel::activity::ExecImpl**>(simcall->args_[0]);
+  return simgrid::simix::unmarshal_raw<const std::vector<simgrid::kernel::activity::ExecImpl*>*>(simcall->args_[0]);
 }
-static inline void simcall_execution_waitany_for__set__execs(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl** arg)
+static inline void simcall_execution_waitany_for__set__execs(smx_simcall_t simcall, const std::vector<simgrid::kernel::activity::ExecImpl*>* arg)
 {
-  simgrid::simix::marshal<simgrid::kernel::activity::ExecImpl**>(simcall->args_[0], arg);
-}
-static inline size_t simcall_execution_waitany_for__get__count(smx_simcall_t simcall)
-{
-  return simgrid::simix::unmarshal<size_t>(simcall->args_[1]);
-}
-static inline size_t simcall_execution_waitany_for__getraw__count(smx_simcall_t simcall)
-{
-  return simgrid::simix::unmarshal_raw<size_t>(simcall->args_[1]);
-}
-static inline void simcall_execution_waitany_for__set__count(smx_simcall_t simcall, size_t arg)
-{
-  simgrid::simix::marshal<size_t>(simcall->args_[1], arg);
+  simgrid::simix::marshal<const std::vector<simgrid::kernel::activity::ExecImpl*>*>(simcall->args_[0], arg);
 }
 static inline double simcall_execution_waitany_for__get__timeout(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal<double>(simcall->args_[2]);
+  return simgrid::simix::unmarshal<double>(simcall->args_[1]);
 }
 static inline double simcall_execution_waitany_for__getraw__timeout(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal_raw<double>(simcall->args_[2]);
+  return simgrid::simix::unmarshal_raw<double>(simcall->args_[1]);
 }
 static inline void simcall_execution_waitany_for__set__timeout(smx_simcall_t simcall, double arg)
 {
-  simgrid::simix::marshal<double>(simcall->args_[2], arg);
+  simgrid::simix::marshal<double>(simcall->args_[1], arg);
 }
 static inline int simcall_execution_waitany_for__get__result(smx_simcall_t simcall)
 {
@@ -712,7 +700,7 @@ static inline void simcall_run_blocking__set__code(smx_simcall_t simcall, std::f
 
 /* The prototype of all simcall handlers, automatically generated for you */
 
-XBT_PRIVATE void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, simgrid::kernel::activity::ExecImpl** execs, size_t count, double timeout);
+XBT_PRIVATE void simcall_HANDLER_execution_waitany_for(smx_simcall_t simcall, const std::vector<simgrid::kernel::activity::ExecImpl*>* execs, double timeout);
 XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_actor_t receiver, smx_mailbox_t mbox, unsigned char* 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, unsigned char* 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_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);
index dae4e75..83a3ec4 100644 (file)
@@ -41,11 +41,11 @@ inline static R simcall(Simcall call, T const&... t)
   return simgrid::simix::unmarshal<R>(self->simcall_.result_);
 }
 
-inline static int simcall_BODY_execution_waitany_for(simgrid::kernel::activity::ExecImpl** execs, size_t count, double timeout)
+inline static int simcall_BODY_execution_waitany_for(const std::vector<simgrid::kernel::activity::ExecImpl*>* execs, double timeout)
 {
   if (false) /* Go to that function to follow the code flow through the simcall barrier */
-    simcall_HANDLER_execution_waitany_for(&SIMIX_process_self()->simcall_, execs, count, timeout);
-  return simcall<int, simgrid::kernel::activity::ExecImpl**, size_t, double>(Simcall::EXECUTION_WAITANY_FOR, execs, count, timeout);
+    simcall_HANDLER_execution_waitany_for(&SIMIX_process_self()->simcall_, execs, timeout);
+  return simcall<int, const std::vector<simgrid::kernel::activity::ExecImpl*>*, double>(Simcall::EXECUTION_WAITANY_FOR, execs, timeout);
 }
 
 inline static void simcall_BODY_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, unsigned char* 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)
index 5e3d98b..122b248 100644 (file)
@@ -57,7 +57,7 @@ void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered_)
     return;
   switch (simcall_.call_) {
     case Simcall::EXECUTION_WAITANY_FOR:
-      simcall_HANDLER_execution_waitany_for(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::ExecImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1]), simgrid::simix::unmarshal<double>(simcall_.args_[2]));
+      simcall_HANDLER_execution_waitany_for(&simcall_, simgrid::simix::unmarshal<const std::vector<simgrid::kernel::activity::ExecImpl*>*>(simcall_.args_[0]), simgrid::simix::unmarshal<double>(simcall_.args_[1]));
       break;
 
     case Simcall::COMM_RECV:
index a6274c6..ecbb39f 100644 (file)
@@ -35,7 +35,7 @@
 # Last but not the least, you should declare the new simix call in
 # ./include/simgrid/simix.h (otherwise you will get a warning at compile time)
 
-int           execution_waitany_for(simgrid::kernel::activity::ExecImpl** execs, size_t count, double timeout) [[block]];
+int           execution_waitany_for(const std::vector<simgrid::kernel::activity::ExecImpl*>* execs, double timeout) [[block]];
 
 void           comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, unsigned char* 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, unsigned char* 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);