A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
now, kernel::actor::simcall_blocking can return a value
[simgrid.git]
/
src
/
s4u
/
s4u_Actor.cpp
diff --git
a/src/s4u/s4u_Actor.cpp
b/src/s4u/s4u_Actor.cpp
index
b5bbadd
..
9cfe9fa
100644
(file)
--- a/
src/s4u/s4u_Actor.cpp
+++ b/
src/s4u/s4u_Actor.cpp
@@
-46,13
+46,14
@@
Actor* Actor::self()
ActorPtr Actor::init(const std::string& name, s4u::Host* host)
{
smx_actor_t self = SIMIX_process_self();
ActorPtr Actor::init(const std::string& name, s4u::Host* host)
{
smx_actor_t self = SIMIX_process_self();
- kernel::actor::ActorImpl* actor = simix::simcall([self, &name, host] { return self->init(name, host).get(); });
+ kernel::actor::ActorImpl* actor =
+ kernel::actor::simcall([self, &name, host] { return self->init(name, host).get(); });
return actor->iface();
}
ActorPtr Actor::start(const std::function<void()>& code)
{
return actor->iface();
}
ActorPtr Actor::start(const std::function<void()>& code)
{
- simgrid::
simix
::simcall([this, &code] { pimpl_->start(code); });
+ simgrid::
kernel::actor
::simcall([this, &code] { pimpl_->start(code); });
return this;
}
return this;
}
@@
-60,7
+61,7
@@
ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::func
{
smx_actor_t self = SIMIX_process_self();
kernel::actor::ActorImpl* actor =
{
smx_actor_t self = SIMIX_process_self();
kernel::actor::ActorImpl* actor =
-
simix
::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); });
+
kernel::actor
::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); });
return actor->iface();
}
return actor->iface();
}
@@
-96,21
+97,20
@@
void Actor::join(double timeout)
{
auto issuer = SIMIX_process_self();
auto target = pimpl_;
{
auto issuer = SIMIX_process_self();
auto target = pimpl_;
-
simix::simcall_blocking
([issuer, target, timeout] {
+
kernel::actor::simcall_blocking<void>
([issuer, target, timeout] {
if (target->finished_) {
// The joined process is already finished, just wake up the issuer right away
issuer->simcall_answer();
} else {
smx_activity_t sync = issuer->join(target, timeout);
if (target->finished_) {
// The joined process is already finished, just wake up the issuer right away
issuer->simcall_answer();
} else {
smx_activity_t sync = issuer->join(target, timeout);
- sync->simcalls_.push_back(&issuer->simcall);
- issuer->waiting_synchro = sync;
+ sync->register_simcall(&issuer->simcall);
}
});
}
void Actor::set_auto_restart(bool autorestart)
{
}
});
}
void Actor::set_auto_restart(bool autorestart)
{
-
simix
::simcall([this, autorestart]() {
+
kernel::actor
::simcall([this, autorestart]() {
xbt_assert(autorestart && not pimpl_->has_to_auto_restart()); // FIXME: handle all cases
pimpl_->set_auto_restart(autorestart);
xbt_assert(autorestart && not pimpl_->has_to_auto_restart()); // FIXME: handle all cases
pimpl_->set_auto_restart(autorestart);
@@
-127,14
+127,14
@@
void Actor::on_exit(const std::function<void(int, void*)>& fun, void* data) /* d
void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
{
void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
{
-
simix
::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); });
+
kernel::actor
::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); });
}
void Actor::migrate(Host* new_host)
{
s4u::Actor::on_migration_start(*this);
}
void Actor::migrate(Host* new_host)
{
s4u::Actor::on_migration_start(*this);
-
simix
::simcall([this, new_host]() {
+
kernel::actor
::simcall([this, new_host]() {
if (pimpl_->waiting_synchro != nullptr) {
// The actor is blocked on an activity. If it's an exec, migrate it too.
// FIXME: implement the migration of other kind of activities
if (pimpl_->waiting_synchro != nullptr) {
// The actor is blocked on an activity. If it's an exec, migrate it too.
// FIXME: implement the migration of other kind of activities
@@
-156,7
+156,7
@@
s4u::Host* Actor::get_host() const
void Actor::daemonize()
{
void Actor::daemonize()
{
-
simix
::simcall([this]() { pimpl_->daemonize(); });
+
kernel::actor
::simcall([this]() { pimpl_->daemonize(); });
}
bool Actor::is_daemon() const
}
bool Actor::is_daemon() const
@@
-186,13
+186,21
@@
aid_t Actor::get_ppid() const
void Actor::suspend()
{
void Actor::suspend()
{
+ auto issuer = SIMIX_process_self();
+ auto target = pimpl_;
s4u::Actor::on_suspend(*this);
s4u::Actor::on_suspend(*this);
- simcall_process_suspend(pimpl_);
+ kernel::actor::simcall_blocking<void>([issuer, target]() {
+ target->suspend(issuer);
+ if (target != issuer) {
+ /* If we are suspending ourselves, then just do not finish the simcall now */
+ issuer->simcall_answer();
+ }
+ });
}
void Actor::resume()
{
}
void Actor::resume()
{
-
simix
::simcall([this] { pimpl_->resume(); });
+
kernel::actor
::simcall([this] { pimpl_->resume(); });
s4u::Actor::on_resume(*this);
}
s4u::Actor::on_resume(*this);
}
@@
-203,7
+211,7
@@
bool Actor::is_suspended()
void Actor::set_kill_time(double kill_time)
{
void Actor::set_kill_time(double kill_time)
{
-
simix
::simcall([this, kill_time] { pimpl_->set_kill_time(kill_time); });
+
kernel::actor
::simcall([this, kill_time] { pimpl_->set_kill_time(kill_time); });
}
/** @brief Get the kill time of an actor(or 0 if unset). */
}
/** @brief Get the kill time of an actor(or 0 if unset). */
@@
-217,7
+225,7
@@
void Actor::kill(aid_t pid) // deprecated
kernel::actor::ActorImpl* killer = SIMIX_process_self();
kernel::actor::ActorImpl* victim = SIMIX_process_from_PID(pid);
if (victim != nullptr) {
kernel::actor::ActorImpl* killer = SIMIX_process_self();
kernel::actor::ActorImpl* victim = SIMIX_process_from_PID(pid);
if (victim != nullptr) {
-
simix
::simcall([killer, victim] { killer->kill(victim); });
+
kernel::actor
::simcall([killer, victim] { killer->kill(victim); });
} else {
std::ostringstream oss;
oss << "kill: (" << pid << ") - No such actor" << std::endl;
} else {
std::ostringstream oss;
oss << "kill: (" << pid << ") - No such actor" << std::endl;
@@
-228,7
+236,7
@@
void Actor::kill(aid_t pid) // deprecated
void Actor::kill()
{
kernel::actor::ActorImpl* process = SIMIX_process_self();
void Actor::kill()
{
kernel::actor::ActorImpl* process = SIMIX_process_self();
-
simix
::simcall([this, process] {
+
kernel::actor
::simcall([this, process] {
xbt_assert(pimpl_ != simix_global->maestro_process, "Killing maestro is a rather bad idea");
process->kill(pimpl_);
});
xbt_assert(pimpl_ != simix_global->maestro_process, "Killing maestro is a rather bad idea");
process->kill(pimpl_);
});
@@
-248,7
+256,7
@@
ActorPtr Actor::by_pid(aid_t pid)
void Actor::kill_all()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
void Actor::kill_all()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
-
simix
::simcall([self] { self->kill_all(); });
+
kernel::actor
::simcall([self] { self->kill_all(); });
}
const std::unordered_map<std::string, std::string>* Actor::get_properties() const
}
const std::unordered_map<std::string, std::string>* Actor::get_properties() const
@@
-264,12
+272,12
@@
const char* Actor::get_property(const std::string& key) const
void Actor::set_property(const std::string& key, const std::string& value)
{
void Actor::set_property(const std::string& key, const std::string& value)
{
-
simix
::simcall([this, &key, &value] { pimpl_->set_property(key, value); });
+
kernel::actor
::simcall([this, &key, &value] { pimpl_->set_property(key, value); });
}
Actor* Actor::restart()
{
}
Actor* Actor::restart()
{
- return
simix
::simcall([this]() { return pimpl_->restart(); });
+ return
kernel::actor
::simcall([this]() { return pimpl_->restart(); });
}
// ***** this_actor *****
}
// ***** this_actor *****
@@
-299,16
+307,14
@@
void sleep_for(double duration)
kernel::actor::ActorImpl* issuer = SIMIX_process_self();
Actor::on_sleep(*issuer->ciface());
kernel::actor::ActorImpl* issuer = SIMIX_process_self();
Actor::on_sleep(*issuer->ciface());
-
simix::simcall_blocking
([issuer, duration]() {
+
kernel::actor::simcall_blocking<void>
([issuer, duration]() {
if (MC_is_active() || MC_record_replay_is_active()) {
MC_process_clock_add(issuer, duration);
issuer->simcall_answer();
return;
}
smx_activity_t sync = issuer->sleep(duration);
if (MC_is_active() || MC_record_replay_is_active()) {
MC_process_clock_add(issuer, duration);
issuer->simcall_answer();
return;
}
smx_activity_t sync = issuer->sleep(duration);
- sync->simcalls_.push_back(&issuer->simcall);
- issuer->waiting_synchro = sync;
-
+ sync->register_simcall(&issuer->simcall);
});
Actor::on_wake_up(*issuer->ciface());
});
Actor::on_wake_up(*issuer->ciface());
@@
-317,7
+323,7
@@
void sleep_for(double duration)
void yield()
{
void yield()
{
-
simix
::simcall([] { /* do nothing*/ });
+
kernel::actor
::simcall([] { /* do nothing*/ });
}
XBT_PUBLIC void sleep_until(double wakeup_time)
}
XBT_PUBLIC void sleep_until(double wakeup_time)
@@
-435,23
+441,20
@@
Host* get_host()
void suspend()
{
void suspend()
{
- kernel::actor::ActorImpl* actor = SIMIX_process_self();
- Actor::on_suspend(*actor->ciface());
-
- simcall_process_suspend(actor);
+ SIMIX_process_self()->iface()->suspend();
}
void resume()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
}
void resume()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
-
simix
::simcall([self] { self->resume(); });
+
kernel::actor
::simcall([self] { self->resume(); });
Actor::on_resume(*self->ciface());
}
void exit()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
Actor::on_resume(*self->ciface());
}
void exit()
{
kernel::actor::ActorImpl* self = SIMIX_process_self();
- simgrid::
simix
::simcall([self] { self->exit(); });
+ simgrid::
kernel::actor
::simcall([self] { self->exit(); });
}
void on_exit(const std::function<void(bool)>& fun)
}
void on_exit(const std::function<void(bool)>& fun)