From: Frederic Suter Date: Thu, 2 Aug 2018 08:52:15 +0000 (+0200) Subject: working version. X-Git-Tag: v3_21~302^2^2~3 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6d0a1577e793ff234e7f12de5f13572685538d10?hp=138a767165df006f5ae2a28a5d0db79f06c6a7fb working version. --- diff --git a/include/simgrid/s4u/Io.hpp b/include/simgrid/s4u/Io.hpp index 1625419e1f..ea92b923ff 100644 --- a/include/simgrid/s4u/Io.hpp +++ b/include/simgrid/s4u/Io.hpp @@ -30,6 +30,7 @@ public: Activity* cancel() override; double get_remaining() override; + sg_size_t get_performed_ioops(); IoPtr set_io_type(OpType type); private: diff --git a/include/simgrid/s4u/Storage.hpp b/include/simgrid/s4u/Storage.hpp index 801f235bb2..1b1bb5dac2 100644 --- a/include/simgrid/s4u/Storage.hpp +++ b/include/simgrid/s4u/Storage.hpp @@ -62,7 +62,7 @@ public: void set_data(void* data) { userdata_ = data; } void* get_data() { return userdata_; } - static IoPtr io_init(sg_size_t size); + IoPtr io_init(sg_size_t size); sg_size_t read(sg_size_t size); sg_size_t write(sg_size_t size); diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 4f5047b54c..0331d6b813 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -285,9 +285,8 @@ XBT_PUBLIC void SIMIX_sem_destroy(smx_sem_t sem); XBT_PUBLIC void simcall_sem_acquire(smx_sem_t sem); XBT_PUBLIC int simcall_sem_acquire_timeout(smx_sem_t sem, double max_duration); -/***************************** Storage **********************************/ -XBT_PUBLIC sg_size_t simcall_storage_read(surf_storage_t st, sg_size_t size); -XBT_PUBLIC sg_size_t simcall_storage_write(surf_storage_t fd, sg_size_t size); +/***************************** Io **************************************/ +XBT_PUBLIC e_smx_state_t simcall_io_wait(smx_activity_t io); /************************** MC simcalls **********************************/ XBT_PUBLIC int simcall_mc_random(int min, int max); diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index 97d334c841..7c170905ee 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -21,7 +21,7 @@ simgrid::kernel::activity::IoImpl::IoImpl(std::string name, resource::Action* su simgrid::kernel::activity::IoImpl::~IoImpl() { - if (surf_action_) + if (surf_action_ != nullptr) surf_action_->unref(); XBT_DEBUG("Destroy exec %p", this); } @@ -52,19 +52,7 @@ double simgrid::kernel::activity::IoImpl::get_remaining() void simgrid::kernel::activity::IoImpl::post() { - for (smx_simcall_t const& simcall : simcalls_) { - switch (simcall->call) { - case SIMCALL_STORAGE_WRITE: - simcall_storage_write__set__result(simcall, surf_action_->get_cost()); - break; - case SIMCALL_STORAGE_READ: - simcall_storage_read__set__result(simcall, surf_action_->get_cost()); - break; - default: - break; - } - } - + performed_ioops_ = surf_action_->get_cost(); switch (surf_action_->get_state()) { case simgrid::kernel::resource::Action::State::FAILED: state_ = SIMIX_FAILED; @@ -76,7 +64,6 @@ void simgrid::kernel::activity::IoImpl::post() THROW_IMPOSSIBLE; break; } - SIMIX_io_finish(this); } /************* diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index f44f09044a..6b06b072d4 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -25,10 +25,11 @@ public: void post() override; void cancel(); double get_remaining(); + sg_size_t get_performed_ioops() { return performed_ioops_; } s4u::Storage* storage_ = nullptr; simgrid::kernel::resource::Action* surf_action_ = nullptr; - + sg_size_t performed_ioops_ = 0; static simgrid::xbt::signal on_creation; static simgrid::xbt::signal on_completion; }; diff --git a/src/s4u/s4u_Io.cpp b/src/s4u/s4u_Io.cpp index 2f6d6ed91c..5f6303fd55 100644 --- a/src/s4u/s4u_Io.cpp +++ b/src/s4u/s4u_Io.cpp @@ -30,7 +30,7 @@ Activity* Io::cancel() Activity* Io::wait() { - // simcall_execution_wait(pimpl_); + simcall_io_wait(pimpl_); state_ = State::FINISHED; return this; } @@ -40,31 +40,18 @@ Activity* Io::wait(double timeout) THROW_UNIMPLEMENTED; return this; } -// -///** @brief Returns whether the state of the exec is finished */ -// bool Exec::test() -//{ -// xbt_assert(state_ == State::INITED || state_ == State::STARTED || state_ == State::FINISHED); -// -// if (state_ == State::FINISHED) -// return true; -// -// if (state_ == State::INITED) -// this->start(); -// -// if (simcall_execution_test(pimpl_)) { -// state_ = State::FINISHED; -// return true; -// } -// -// return false; -//} /** @brief Returns the amount of flops that remain to be done */ double Io::get_remaining() { return simgrid::simix::simcall( - [this]() { return boost::static_pointer_cast(pimpl_)->get_remaining(); }); + [this]() { return boost::static_pointer_cast(pimpl_)->get_remaining(); }); +} + +sg_size_t Io::get_performed_ioops() +{ + return simgrid::simix::simcall( + [this]() { return boost::static_pointer_cast(pimpl_)->get_performed_ioops(); }); } IoPtr Io::set_io_type(OpType type) @@ -74,24 +61,17 @@ IoPtr Io::set_io_type(OpType type) return this; } -// double Io::get_remaining_ratio() -//{ -// return simgrid::simix::simcall([this]() { -// return boost::static_pointer_cast(pimpl_)->get_remaining_ratio(); -// }); -//} - -void intrusive_ptr_release(simgrid::s4u::Io* e) +void intrusive_ptr_release(simgrid::s4u::Io* i) { - if (e->refcount_.fetch_sub(1, std::memory_order_release) == 1) { + if (i->refcount_.fetch_sub(1, std::memory_order_release) == 1) { std::atomic_thread_fence(std::memory_order_acquire); - delete e; + delete i; } } -void intrusive_ptr_add_ref(simgrid::s4u::Io* e) +void intrusive_ptr_add_ref(simgrid::s4u::Io* i) { - e->refcount_.fetch_add(1, std::memory_order_relaxed); + i->refcount_.fetch_add(1, std::memory_order_relaxed); } } // namespace s4u } // namespace simgrid diff --git a/src/s4u/s4u_Storage.cpp b/src/s4u/s4u_Storage.cpp index e8aa233177..2b6b7f5724 100644 --- a/src/s4u/s4u_Storage.cpp +++ b/src/s4u/s4u_Storage.cpp @@ -60,18 +60,25 @@ IoPtr Storage::io_init(sg_size_t size) { IoPtr res = IoPtr(new Io()); res->size_ = size; + res->storage_ = this; res->set_remaining(size); return res; } sg_size_t Storage::read(sg_size_t size) { - return simcall_storage_read(pimpl_, size); + IoPtr i = io_init(size); + i->set_io_type(Io::OpType::READ); + i->start()->wait(); + return i->get_performed_ioops(); } sg_size_t Storage::write(sg_size_t size) { - return simcall_storage_write(pimpl_, size); + IoPtr i = io_init(size); + i->set_io_type(Io::OpType::WRITE); + i->start()->wait(); + return i->get_performed_ioops(); } // Deprecated functions diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 447032f7fb..68badd050e 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -468,14 +468,9 @@ int simcall_sem_acquire_timeout(smx_sem_t sem, double timeout) return simcall_BODY_sem_acquire_timeout(sem, timeout); } -sg_size_t simcall_storage_read(surf_storage_t st, sg_size_t size) +e_smx_state_t simcall_io_wait(smx_activity_t io) { - return simcall_BODY_storage_read(st, size); -} - -sg_size_t simcall_storage_write(surf_storage_t st, sg_size_t size) -{ - return simcall_BODY_storage_write(st, size); + return (e_smx_state_t)simcall_BODY_io_wait(io); } void simcall_run_kernel(std::function const& code) diff --git a/src/simix/popping_accessors.hpp b/src/simix/popping_accessors.hpp index 072cf55725..5b2d81fb57 100644 --- a/src/simix/popping_accessors.hpp +++ b/src/simix/popping_accessors.hpp @@ -987,76 +987,29 @@ static inline void simcall_sem_acquire_timeout__set__result(smx_simcall_t simcal simgrid::simix::marshal(simcall->result, result); } -static inline surf_storage_t simcall_storage_read__get__st(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args[0]); -} -static inline surf_storage_t simcall_storage_read__getraw__st(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args[0]); -} -static inline void simcall_storage_read__set__st(smx_simcall_t simcall, surf_storage_t arg) -{ - simgrid::simix::marshal(simcall->args[0], arg); -} -static inline sg_size_t simcall_storage_read__get__size(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args[1]); -} -static inline sg_size_t simcall_storage_read__getraw__size(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args[1]); -} -static inline void simcall_storage_read__set__size(smx_simcall_t simcall, sg_size_t arg) -{ - simgrid::simix::marshal(simcall->args[1], arg); -} -static inline sg_size_t simcall_storage_read__get__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->result); -} -static inline sg_size_t simcall_storage_read__getraw__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->result); -} -static inline void simcall_storage_read__set__result(smx_simcall_t simcall, sg_size_t result) -{ - simgrid::simix::marshal(simcall->result, result); -} - -static inline surf_storage_t simcall_storage_write__get__st(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args[0]); -} -static inline surf_storage_t simcall_storage_write__getraw__st(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args[0]); -} -static inline void simcall_storage_write__set__st(smx_simcall_t simcall, surf_storage_t arg) -{ - simgrid::simix::marshal(simcall->args[0], arg); -} -static inline sg_size_t simcall_storage_write__get__size(smx_simcall_t simcall) +static inline boost::intrusive_ptr +simcall_io_wait__get__io(smx_simcall_t simcall) { - return simgrid::simix::unmarshal(simcall->args[1]); + return simgrid::simix::unmarshal>(simcall->args[0]); } -static inline sg_size_t simcall_storage_write__getraw__size(smx_simcall_t simcall) +static inline simgrid::kernel::activity::ActivityImpl* simcall_io_wait__getraw__io(smx_simcall_t simcall) { - return simgrid::simix::unmarshal_raw(simcall->args[1]); + return simgrid::simix::unmarshal_raw(simcall->args[0]); } -static inline void simcall_storage_write__set__size(smx_simcall_t simcall, sg_size_t arg) +static inline void simcall_io_wait__set__io(smx_simcall_t simcall, + boost::intrusive_ptr arg) { - simgrid::simix::marshal(simcall->args[1], arg); + simgrid::simix::marshal>(simcall->args[0], arg); } -static inline sg_size_t simcall_storage_write__get__result(smx_simcall_t simcall) +static inline sg_size_t simcall_io_wait__get__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->result); } -static inline sg_size_t simcall_storage_write__getraw__result(smx_simcall_t simcall) +static inline sg_size_t simcall_io_wait__getraw__result(smx_simcall_t simcall) { return simgrid::simix::unmarshal_raw(simcall->result); } -static inline void simcall_storage_write__set__result(smx_simcall_t simcall, sg_size_t result) +static inline void simcall_io_wait__set__result(smx_simcall_t simcall, sg_size_t result) { simgrid::simix::marshal(simcall->result, result); } @@ -1149,6 +1102,6 @@ XBT_PRIVATE void simcall_HANDLER_cond_wait(smx_simcall_t simcall, smx_cond_t con XBT_PRIVATE void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout); XBT_PRIVATE void simcall_HANDLER_sem_acquire(smx_simcall_t simcall, smx_sem_t sem); XBT_PRIVATE void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout); -XBT_PRIVATE void simcall_HANDLER_storage_read(smx_simcall_t simcall, surf_storage_t st, sg_size_t size); -XBT_PRIVATE void simcall_HANDLER_storage_write(smx_simcall_t simcall, surf_storage_t st, sg_size_t size); +XBT_PRIVATE void simcall_HANDLER_io_wait(smx_simcall_t simcall, + boost::intrusive_ptr io); XBT_PRIVATE int simcall_HANDLER_mc_random(smx_simcall_t simcall, int min, int max); \ No newline at end of file diff --git a/src/simix/popping_bodies.cpp b/src/simix/popping_bodies.cpp index e282a76b00..cfdeded0dd 100644 --- a/src/simix/popping_bodies.cpp +++ b/src/simix/popping_bodies.cpp @@ -184,18 +184,11 @@ inline static int simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout return simcall(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem, timeout); } -inline static sg_size_t simcall_BODY_storage_read(surf_storage_t st, sg_size_t size) +inline static sg_size_t simcall_BODY_io_wait(boost::intrusive_ptr io) { if (0) /* Go to that function to follow the code flow through the simcall barrier */ - simcall_HANDLER_storage_read(&SIMIX_process_self()->simcall, st, size); - return simcall(SIMCALL_STORAGE_READ, st, size); -} - -inline static sg_size_t simcall_BODY_storage_write(surf_storage_t st, sg_size_t size) -{ - if (0) /* Go to that function to follow the code flow through the simcall barrier */ - simcall_HANDLER_storage_write(&SIMIX_process_self()->simcall, st, size); - return simcall(SIMCALL_STORAGE_WRITE, st, size); + simcall_HANDLER_io_wait(&SIMIX_process_self()->simcall, io); + return simcall>(SIMCALL_IO_WAIT, io); } inline static int simcall_BODY_mc_random(int min, int max) diff --git a/src/simix/popping_enum.h b/src/simix/popping_enum.h index 7305834776..0c610a73b6 100644 --- a/src/simix/popping_enum.h +++ b/src/simix/popping_enum.h @@ -40,8 +40,7 @@ typedef enum { SIMCALL_COND_WAIT_TIMEOUT, SIMCALL_SEM_ACQUIRE, SIMCALL_SEM_ACQUIRE_TIMEOUT, - SIMCALL_STORAGE_READ, - SIMCALL_STORAGE_WRITE, + SIMCALL_IO_WAIT, SIMCALL_MC_RANDOM, SIMCALL_RUN_KERNEL, SIMCALL_RUN_BLOCKING, diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index e8875d3c70..a4a813389d 100644 --- a/src/simix/popping_generated.cpp +++ b/src/simix/popping_generated.cpp @@ -27,33 +27,13 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_popping); /** @brief Simcalls' names (generated from src/simix/simcalls.in) */ const char* simcall_names[] = { - "SIMCALL_NONE", - "SIMCALL_PROCESS_SUSPEND", - "SIMCALL_PROCESS_JOIN", - "SIMCALL_PROCESS_SLEEP", - "SIMCALL_EXECUTION_WAIT", - "SIMCALL_EXECUTION_TEST", - "SIMCALL_COMM_IPROBE", - "SIMCALL_COMM_SEND", - "SIMCALL_COMM_ISEND", - "SIMCALL_COMM_RECV", - "SIMCALL_COMM_IRECV", - "SIMCALL_COMM_WAITANY", - "SIMCALL_COMM_WAIT", - "SIMCALL_COMM_TEST", - "SIMCALL_COMM_TESTANY", - "SIMCALL_MUTEX_LOCK", - "SIMCALL_MUTEX_TRYLOCK", - "SIMCALL_MUTEX_UNLOCK", - "SIMCALL_COND_WAIT", - "SIMCALL_COND_WAIT_TIMEOUT", - "SIMCALL_SEM_ACQUIRE", - "SIMCALL_SEM_ACQUIRE_TIMEOUT", - "SIMCALL_STORAGE_READ", - "SIMCALL_STORAGE_WRITE", - "SIMCALL_MC_RANDOM", - "SIMCALL_RUN_KERNEL", - "SIMCALL_RUN_BLOCKING", + "SIMCALL_NONE", "SIMCALL_PROCESS_SUSPEND", "SIMCALL_PROCESS_JOIN", "SIMCALL_PROCESS_SLEEP", + "SIMCALL_EXECUTION_WAIT", "SIMCALL_EXECUTION_TEST", "SIMCALL_COMM_IPROBE", "SIMCALL_COMM_SEND", + "SIMCALL_COMM_ISEND", "SIMCALL_COMM_RECV", "SIMCALL_COMM_IRECV", "SIMCALL_COMM_WAITANY", + "SIMCALL_COMM_WAIT", "SIMCALL_COMM_TEST", "SIMCALL_COMM_TESTANY", "SIMCALL_MUTEX_LOCK", + "SIMCALL_MUTEX_TRYLOCK", "SIMCALL_MUTEX_UNLOCK", "SIMCALL_COND_WAIT", "SIMCALL_COND_WAIT_TIMEOUT", + "SIMCALL_SEM_ACQUIRE", "SIMCALL_SEM_ACQUIRE_TIMEOUT", "SIMCALL_IO_WAIT", "SIMCALL_MC_RANDOM", + "SIMCALL_RUN_KERNEL", "SIMCALL_RUN_BLOCKING", }; /** @private @@ -158,14 +138,10 @@ case SIMCALL_SEM_ACQUIRE_TIMEOUT: simcall_HANDLER_sem_acquire_timeout(simcall, simgrid::simix::unmarshal(simcall->args[0]), simgrid::simix::unmarshal(simcall->args[1])); break; -case SIMCALL_STORAGE_READ: - simcall_HANDLER_storage_read(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); - break; - -case SIMCALL_STORAGE_WRITE: - simcall_HANDLER_storage_write(simcall, simgrid::simix::unmarshal(simcall->args[0]), - simgrid::simix::unmarshal(simcall->args[1])); +case SIMCALL_IO_WAIT: + simcall_HANDLER_io_wait( + simcall, + simgrid::simix::unmarshal>(simcall->args[0])); break; case SIMCALL_MC_RANDOM: diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index 7c26066a64..dff85032ff 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -62,8 +62,7 @@ int cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) void sem_acquire(smx_sem_t sem) [[block]]; int sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]]; -sg_size_t storage_read(surf_storage_t st, sg_size_t size) [[block]]; -sg_size_t storage_write(surf_storage_t st, sg_size_t size) [[block]]; +sg_size_t io_wait(boost::intrusive_ptr io) [[block]]; int mc_random(int min, int max); diff --git a/src/simix/smx_io.cpp b/src/simix/smx_io.cpp index c76819e107..5d9fef2a84 100644 --- a/src/simix/smx_io.cpp +++ b/src/simix/smx_io.cpp @@ -3,12 +3,14 @@ /* 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. */ +#include "mc/mc.h" #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/Io.hpp" #include "xbt/ex.hpp" #include "smx_private.hpp" #include "src/kernel/activity/IoImpl.hpp" +#include "src/mc/mc_replay.hpp" #include "src/simix/smx_io_private.hpp" #include "src/surf/StorageImpl.hpp" @@ -29,41 +31,24 @@ simgrid::kernel::activity::IoImplPtr SIMIX_io_start(std::string name, sg_size_t return io; } -void simcall_HANDLER_storage_read(smx_simcall_t simcall, surf_storage_t st, sg_size_t size) +void simcall_HANDLER_io_wait(smx_simcall_t simcall, smx_activity_t synchro) { - smx_activity_t synchro = SIMIX_storage_read(st, size); - synchro->simcalls_.push_back(simcall); - simcall->issuer->waiting_synchro = synchro; -} - -smx_activity_t SIMIX_storage_read(surf_storage_t st, sg_size_t size) -{ - // simgrid::kernel::activity::IoImpl* synchro = new simgrid::kernel::activity::IoImpl(); - // synchro->surf_action_ = st->read(size); - // - // synchro->surf_action_->set_data(synchro); - // XBT_DEBUG("Create io synchro %p", synchro); - // - // return synchro; - return nullptr; -} + XBT_DEBUG("Wait for execution of synchro %p, state %d", synchro.get(), (int)synchro->state_); -void simcall_HANDLER_storage_write(smx_simcall_t simcall, surf_storage_t st, sg_size_t size) -{ - smx_activity_t synchro = SIMIX_storage_write(st, size); + /* Associate this simcall to the synchro */ synchro->simcalls_.push_back(simcall); simcall->issuer->waiting_synchro = synchro; -} -smx_activity_t SIMIX_storage_write(surf_storage_t st, sg_size_t size) -{ - // simgrid::kernel::activity::IoImpl* synchro = new simgrid::kernel::activity::IoImpl(); - // synchro->surf_action_ = st->write(size); - // synchro->surf_action_->set_data(synchro); - // XBT_DEBUG("Create io synchro %p", synchro); - // - // return synchro; - return nullptr; + /* set surf's synchro */ + if (MC_is_active() || MC_record_replay_is_active()) { + synchro->state_ = SIMIX_DONE; + SIMIX_io_finish(synchro); + return; + } + + /* If the synchro is already finished then perform the error handling */ + if (synchro->state_ != SIMIX_RUNNING) + SIMIX_io_finish(synchro); } void SIMIX_io_destroy(smx_activity_t synchro) @@ -98,7 +83,4 @@ void SIMIX_io_finish(smx_activity_t synchro) simcall->issuer->waiting_synchro = nullptr; SIMIX_simcall_answer(simcall); } - - /* We no longer need it */ - SIMIX_io_destroy(synchro); } diff --git a/src/simix/smx_io_private.hpp b/src/simix/smx_io_private.hpp index ee9db6058d..1cfa95754b 100644 --- a/src/simix/smx_io_private.hpp +++ b/src/simix/smx_io_private.hpp @@ -13,8 +13,6 @@ #include "simgrid/simix.h" XBT_PRIVATE simgrid::kernel::activity::IoImplPtr SIMIX_io_start(std::string name, sg_size_t size, sg_storage_t storage, simgrid::s4u::Io::OpType type); -XBT_PRIVATE smx_activity_t SIMIX_storage_read(surf_storage_t fd, sg_size_t size); -XBT_PRIVATE smx_activity_t SIMIX_storage_write(surf_storage_t fd, sg_size_t size); XBT_PRIVATE void SIMIX_io_destroy(smx_activity_t synchro); XBT_PRIVATE void SIMIX_io_finish(smx_activity_t synchro);