1 /* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "simgrid/s4u/Activity.hpp"
9 #include "simgrid/s4u/Engine.hpp"
10 #include "src/kernel/activity/ActivityImpl.hpp"
14 XBT_LOG_EXTERNAL_CATEGORY(s4u);
15 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
20 void Activity::wait_until(double time_limit)
22 double now = Engine::get_clock();
24 wait_for(time_limit - now);
29 xbt_assert(state_ == State::INITED || state_ == State::STARTED || state_ == State::STARTING ||
30 state_ == State::CANCELED || state_ == State::FINISHED);
32 if (state_ == State::CANCELED || state_ == State::FINISHED)
35 if (state_ == State::INITED || state_ == State::STARTING)
36 this->vetoable_start();
38 if (kernel::actor::simcall([this] { return this->get_impl()->test(); })) {
39 state_ = State::FINISHED;
40 this->release_dependencies();
47 Activity* Activity::suspend()
50 return this; // Already suspended
53 if (state_ == State::STARTED)
59 Activity* Activity::resume()
62 return this; // nothing to restore when it's not suspended
64 if (state_ == State::STARTED)
70 const char* Activity::get_state_str() const
72 constexpr std::array<const char*, 5> names{{"INITED", "STARTING", "STARTED", "CANCELED", "FINISHED"}};
73 return names[static_cast<int>(state_)];
76 double Activity::get_remaining() const
78 if (state_ == State::INITED || state_ == State::STARTING)
81 return pimpl_->get_remaining();
84 Activity* Activity::set_remaining(double remains)
86 xbt_assert(state_ == State::INITED, "Cannot change the remaining amount of work once the Activity is started");
92 } // namespace simgrid