X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8aaeb1abf1f983858397fca85e3d3504f6b1633c..f9b13d923d31bb0336aeeaab6d5b7ba33812f3f7:/src/simix/libsmx.cpp diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 48365ed7a1..0dd298f2b9 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -5,7 +5,7 @@ /* */ /* This is somehow the "libc" of SimGrid */ -/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2022. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -18,27 +18,13 @@ #include "src/kernel/actor/SimcallObserver.hpp" #include "src/mc/mc_replay.hpp" #include "xbt/random.hpp" +#include #include "popping_bodies.cpp" #include #include #include -XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); - -unsigned int simcall_execution_waitany_for(simgrid::kernel::activity::ExecImpl* execs[], size_t count, - double timeout) // XBT_ATTRIB_DEPRECATED_v331 -{ - std::vector execs_vec(execs, execs + count); - simgrid::kernel::actor::ActorImpl* issuer = simgrid::kernel::actor::ActorImpl::self(); - simgrid::kernel::actor::ExecutionWaitanySimcall observer{issuer, execs_vec, timeout}; - return simgrid::kernel::actor::simcall_blocking( - [&observer] { - simgrid::kernel::activity::ExecImpl::wait_any_for(observer.get_issuer(), observer.get_execs(), - observer.get_timeout()); - }, - &observer); -} /** * @ingroup simix_comm_management @@ -56,12 +42,23 @@ void simcall_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, xbt_assert(mbox, "No rendez-vous point defined for send"); if (MC_is_active() || MC_record_replay_is_active()) { - /* the model-checker wants two separate simcalls */ - simgrid::kernel::activity::ActivityImplPtr comm = - nullptr; /* MC needs the comm to be set to nullptr during the simcall */ - comm = simcall_comm_isend(sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, nullptr, copy_data_fun, - data, false); - simcall_comm_wait(comm.get(), timeout); + /* the model-checker wants two separate simcalls, and wants comm to be nullptr during the simcall */ + simgrid::kernel::activity::ActivityImplPtr comm = nullptr; + + simgrid::kernel::actor::CommIsendSimcall send_observer{ + sender, mbox, task_size, rate, static_cast(src_buff), src_buff_size, match_fun, + nullptr, copy_data_fun, data, false}; + comm = simgrid::kernel::actor::simcall( + [&send_observer] { return simgrid::kernel::activity::CommImpl::isend(&send_observer); }, &send_observer); + + simgrid::kernel::actor::ActivityWaitSimcall wait_observer{sender, comm.get(), timeout}; + if (simgrid::kernel::actor::simcall_blocking( + [&wait_observer] { + wait_observer.get_activity()->wait_for(wait_observer.get_issuer(), wait_observer.get_timeout()); + }, + &wait_observer)) { + throw simgrid::TimeoutException(XBT_THROW_POINT, "Timeouted"); + } comm = nullptr; } else { @@ -101,12 +98,22 @@ void simcall_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, xbt_assert(mbox, "No rendez-vous point defined for recv"); if (MC_is_active() || MC_record_replay_is_active()) { - /* the model-checker wants two separate simcalls */ - simgrid::kernel::activity::ActivityImplPtr comm = - nullptr; /* MC needs the comm to be set to nullptr during the simcall */ - comm = simcall_comm_irecv(receiver, mbox, dst_buff, dst_buff_size, - match_fun, copy_data_fun, data, rate); - simcall_comm_wait(comm.get(), timeout); + /* the model-checker wants two separate simcalls, and wants comm to be nullptr during the simcall */ + simgrid::kernel::activity::ActivityImplPtr comm = nullptr; + + simgrid::kernel::actor::CommIrecvSimcall observer{ + receiver, mbox, static_cast(dst_buff), dst_buff_size, match_fun, copy_data_fun, data, rate}; + comm = simgrid::kernel::actor::simcall( + [&observer] { return simgrid::kernel::activity::CommImpl::irecv(&observer); }, &observer); + + simgrid::kernel::actor::ActivityWaitSimcall wait_observer{receiver, comm.get(), timeout}; + if (simgrid::kernel::actor::simcall_blocking( + [&wait_observer] { + wait_observer.get_activity()->wait_for(wait_observer.get_issuer(), wait_observer.get_timeout()); + }, + &wait_observer)) { + throw simgrid::TimeoutException(XBT_THROW_POINT, "Timeouted"); + } comm = nullptr; } else { @@ -131,7 +138,8 @@ simcall_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, siz /** * @ingroup simix_comm_management */ -ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout) +ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, + double timeout) // XBT_ATTRIB_DEPRECATED_v335 { return simcall_BODY_comm_waitany(comms, count, timeout); } @@ -139,11 +147,24 @@ ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_ /** * @ingroup simix_comm_management */ -ssize_t simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count) +ssize_t simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count) // XBT_ATTRIB_DEPRECATED_v335 { if (count == 0) return -1; - return simcall_BODY_comm_testany(comms, count); + std::vector activities; + for (size_t i = 0; i < count; i++) + activities.push_back(static_cast(comms[i])); + + simgrid::kernel::actor::ActorImpl* issuer = simgrid::kernel::actor::ActorImpl::self(); + simgrid::kernel::actor::ActivityTestanySimcall observer{issuer, activities}; + ssize_t changed_pos = simgrid::kernel::actor::simcall_blocking( + [&observer] { + simgrid::kernel::activity::ActivityImpl::test_any(observer.get_issuer(), observer.get_activities()); + }, + &observer); + if (changed_pos != -1) + comms[changed_pos]->get_iface()->complete(simgrid::s4u::Activity::State::FINISHED); + return changed_pos; } /** @@ -159,73 +180,16 @@ void simcall_comm_wait(simgrid::kernel::activity::ActivityImpl* comm, double tim * @ingroup simix_comm_management * */ -bool simcall_comm_test(simgrid::kernel::activity::ActivityImpl* comm) -{ - return simcall_BODY_comm_test(static_cast(comm)); -} - -/** - * @ingroup simix_synchro_management - * - */ -void simcall_mutex_lock(smx_mutex_t mutex) // XBT_ATTRIB_DEPRECATD_v331 -{ - mutex->mutex().lock(); -} - -/** - * @ingroup simix_synchro_management - * - */ -int simcall_mutex_trylock(smx_mutex_t mutex) // XBT_ATTRIB_DEPRECATD_v331 -{ - return mutex->mutex().try_lock(); -} - -/** - * @ingroup simix_synchro_management - * - */ -void simcall_mutex_unlock(smx_mutex_t mutex) // XBT_ATTRIB_DEPRECATD_v331 +bool simcall_comm_test(simgrid::kernel::activity::ActivityImpl* comm) // XBT_ATTRIB_DEPRECATED_v335 { - mutex->mutex().unlock(); -} - -/** - * @ingroup simix_synchro_management - * - */ -void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex) // XBT_ATTRIB_DEPRECATED_v331 -{ - cond->get_iface()->wait(std::unique_lock(mutex->mutex())); -} - -/** - * @ingroup simix_synchro_management - * - */ -int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) // XBT_ATTRIB_DEPRECATD_v331 -{ - return cond->get_iface()->wait_for(std::unique_lock(mutex->mutex()), timeout) == - std::cv_status::timeout; -} - -/** - * @ingroup simix_synchro_management - * - */ -void simcall_sem_acquire(smx_sem_t sem) // XBT_ATTRIB_DEPRECATD_v331 -{ - return sem->sem().acquire(); -} - -/** - * @ingroup simix_synchro_management - * - */ -int simcall_sem_acquire_timeout(smx_sem_t sem, double timeout) // XBT_ATTRIB_DEPRECATD_v331 -{ - return sem->sem().acquire_timeout(timeout); + simgrid::kernel::actor::ActorImpl* issuer = simgrid::kernel::actor::ActorImpl::self(); + simgrid::kernel::actor::ActivityTestSimcall observer{issuer, comm}; + if (simgrid::kernel::actor::simcall_blocking([&observer] { observer.get_activity()->test(observer.get_issuer()); }, + &observer)) { + comm->get_iface()->complete(simgrid::s4u::Activity::State::FINISHED); + return true; + } + return false; } void simcall_run_kernel(std::function const& code, simgrid::kernel::actor::SimcallObserver* observer) @@ -242,17 +206,17 @@ void simcall_run_blocking(std::function const& code, simgrid::kernel::ac simgrid::kernel::actor::ActorImpl::self()->simcall_.observer_ = nullptr; } -int simcall_mc_random(int min, int max) // XBT_ATTRIB_DEPRECATD_v331 -{ - return MC_random(min, max); -} - /* ************************************************************************** */ /** @brief returns a printable string representing a simcall */ const char* SIMIX_simcall_name(const s_smx_simcall& simcall) { if (simcall.observer_ != nullptr) { +#if SIMGRID_HAVE_MC + if (mc_model_checker != nullptr) // Do not try to use the observer from the MCer + return "(remotely observed)"; +#endif + static std::string name; name = boost::core::demangle(typeid(*simcall.observer_).name()); const char* cname = name.c_str();