XBT_INFO("Goodbye now!");
}
+static void test_monitor(sg_size_t size)
+{
+ simgrid::s4u::Disk* disk = simgrid::s4u::Host::current()->get_disks().front();
+ simgrid::s4u::this_actor::sleep_for(1);
+ simgrid::s4u::IoPtr activity = disk->write_async(size);
+
+ while (not activity->test()) {
+ XBT_INFO("Remaining amount of bytes to write: %g", activity->get_remaining());
+ simgrid::s4u::this_actor::sleep_for(0.2);
+ }
+ activity->wait();
+
+ XBT_INFO("Goodbye now!");
+}
+
int main(int argc, char* argv[])
{
simgrid::s4u::Engine e(&argc, argv);
simgrid::s4u::Actor::create("test", simgrid::s4u::Host::by_name("bob"), test, 2e7);
simgrid::s4u::Actor::create("test_waitfor", simgrid::s4u::Host::by_name("alice"), test_waitfor, 5e7);
simgrid::s4u::Actor::create("test_cancel", simgrid::s4u::Host::by_name("alice"), test_cancel, 5e7);
+ simgrid::s4u::Actor::create("test_monitor", simgrid::s4u::Host::by_name("alice"), test_monitor, 5e7);
e.run();
> [ 0.500000] (3:test_cancel@alice) Hello! write 50000000 bytes from Disk1
> [ 1.000000] (3:test_cancel@alice) I changed my mind, cancel!
> [ 1.000000] (3:test_cancel@alice) Goodbye now!
-> [ 1.000000] (0:maestro@) Simulation time 1
+> [ 1.000000] (4:test_monitor@alice) Remaining amount of bytes to write: 5e+07
+> [ 1.200000] (4:test_monitor@alice) Remaining amount of bytes to write: 3.4e+07
+> [ 1.400000] (4:test_monitor@alice) Remaining amount of bytes to write: 1.8e+07
+> [ 1.600000] (4:test_monitor@alice) Remaining amount of bytes to write: 2e+06
+> [ 1.800000] (4:test_monitor@alice) Goodbye now!
+> [ 1.800000] (0:maestro@) Simulation time 1.8
/***************************** Io **************************************/
#ifdef __cplusplus
XBT_PUBLIC e_smx_state_t simcall_io_wait(const smx_activity_t& io, double timeout);
+XBT_PUBLIC bool simcall_io_test(const smx_activity_t& io);
#endif
/************************** MC simcalls **********************************/
SG_BEGIN_DECL
}
}
+void simcall_HANDLER_io_test(smx_simcall_t simcall, simgrid::kernel::activity::IoImpl* synchro)
+{
+ bool res = (synchro->state_ != simgrid::kernel::activity::State::WAITING &&
+ synchro->state_ != simgrid::kernel::activity::State::RUNNING);
+ if (res) {
+ synchro->simcalls_.push_back(simcall);
+ synchro->finish();
+ } else {
+ simcall->issuer_->simcall_answer();
+ }
+ simcall_io_test__set__result(simcall, res);
+}
+
namespace simgrid {
namespace kernel {
namespace activity {
if (state_ == State::INITED)
this->start();
- THROW_UNIMPLEMENTED;
+ if (simcall_io_test(pimpl_)) {
+ state_ = State::FINISHED;
+ return true;
+ }
- // return false
+ return false;
}
/** @brief Returns the amount of flops that remain to be done */
return (e_smx_state_t)simcall_BODY_io_wait(static_cast<simgrid::kernel::activity::IoImpl*>(io.get()), timeout);
}
+bool simcall_io_test(const smx_activity_t& io)
+{
+ return simcall_BODY_io_test(static_cast<simgrid::kernel::activity::IoImpl*>(io.get()));
+}
+
void simcall_run_kernel(std::function<void()> const& code, simgrid::mc::SimcallInspector* t)
{
simgrid::kernel::actor::ActorImpl::self()->simcall.inspector_ = t;
simgrid::simix::marshal<sg_size_t>(simcall->result_, result);
}
+static inline simgrid::kernel::activity::IoImpl* simcall_io_test__get__io(smx_simcall_t simcall)
+{
+ return simgrid::simix::unmarshal<simgrid::kernel::activity::IoImpl*>(simcall->args_[0]);
+}
+static inline simgrid::kernel::activity::IoImpl* simcall_io_test__getraw__io(smx_simcall_t simcall)
+{
+ return simgrid::simix::unmarshal_raw<simgrid::kernel::activity::IoImpl*>(simcall->args_[0]);
+}
+static inline void simcall_io_test__set__io(smx_simcall_t simcall, simgrid::kernel::activity::IoImpl* arg)
+{
+ simgrid::simix::marshal<simgrid::kernel::activity::IoImpl*>(simcall->args_[0], arg);
+}
+static inline bool simcall_io_test__get__result(smx_simcall_t simcall)
+{
+ return simgrid::simix::unmarshal<bool>(simcall->result_);
+}
+static inline bool simcall_io_test__getraw__result(smx_simcall_t simcall)
+{
+ return simgrid::simix::unmarshal_raw<bool>(simcall->result_);
+}
+static inline void simcall_io_test__set__result(smx_simcall_t simcall, bool result)
+{
+ simgrid::simix::marshal<bool>(simcall->result_, result);
+}
+
static inline int simcall_mc_random__get__min(smx_simcall_t simcall)
{
return simgrid::simix::unmarshal<int>(simcall->args_[0]);
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_io_wait(smx_simcall_t simcall, simgrid::kernel::activity::IoImpl* io, double timeout);
+XBT_PRIVATE void simcall_HANDLER_io_test(smx_simcall_t simcall, simgrid::kernel::activity::IoImpl* io);
XBT_PRIVATE int simcall_HANDLER_mc_random(smx_simcall_t simcall, int min, int max);
return simcall<sg_size_t, simgrid::kernel::activity::IoImpl*, double>(SIMCALL_IO_WAIT, io, timeout);
}
+inline static bool simcall_BODY_io_test(simgrid::kernel::activity::IoImpl* io)
+{
+ if (0) /* Go to that function to follow the code flow through the simcall barrier */
+ simcall_HANDLER_io_test(&SIMIX_process_self()->simcall, io);
+ return simcall<bool, simgrid::kernel::activity::IoImpl*>(SIMCALL_IO_TEST, io);
+}
+
inline static int simcall_BODY_mc_random(int min, int max)
{
if (0) /* Go to that function to follow the code flow through the simcall barrier */
SIMCALL_SEM_ACQUIRE,
SIMCALL_SEM_ACQUIRE_TIMEOUT,
SIMCALL_IO_WAIT,
+ SIMCALL_IO_TEST,
SIMCALL_MC_RANDOM,
SIMCALL_RUN_KERNEL,
SIMCALL_RUN_BLOCKING,
"SIMCALL_SEM_ACQUIRE",
"SIMCALL_SEM_ACQUIRE_TIMEOUT",
"SIMCALL_IO_WAIT",
+ "SIMCALL_IO_TEST",
"SIMCALL_MC_RANDOM",
"SIMCALL_RUN_KERNEL",
"SIMCALL_RUN_BLOCKING",
simcall_HANDLER_io_wait(&simcall, simgrid::simix::unmarshal<simgrid::kernel::activity::IoImpl*>(simcall.args_[0]), simgrid::simix::unmarshal<double>(simcall.args_[1]));
break;
+ case SIMCALL_IO_TEST:
+ simcall_HANDLER_io_test(&simcall, simgrid::simix::unmarshal<simgrid::kernel::activity::IoImpl*>(simcall.args_[0]));
+ break;
+
case SIMCALL_MC_RANDOM:
simgrid::simix::marshal<int>(simcall.result_, simcall_HANDLER_mc_random(&simcall, simgrid::simix::unmarshal<int>(simcall.args_[0]), simgrid::simix::unmarshal<int>(simcall.args_[1])));
simcall_answer();
int sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]];
sg_size_t io_wait(simgrid::kernel::activity::IoImpl* io, double timeout) [[block]];
+bool io_test(simgrid::kernel::activity::IoImpl* io) [[block]];
int mc_random(int min, int max);