Commit a854615b authored by Joseph Noir's avatar Joseph Noir

Merge branch 'topic/opencl' of github.com:Neverlord/libcppa into topic/opencl

Conflicts:
	cppa/opencl/actor_facade.hpp
parents 5f67029e e957731f
......@@ -83,7 +83,7 @@ class event_based_actor : public scheduled_actor {
protected:
event_based_actor();
event_based_actor(actor_state st = actor_state::blocked);
// provoke compiler errors for usage of receive() and related functions
......
......@@ -36,6 +36,8 @@
#include "cppa/logging.hpp"
#include "cppa/event_based_actor.hpp"
using namespace std;
namespace cppa {
class default_scheduled_actor : public event_based_actor {
......@@ -46,16 +48,28 @@ class default_scheduled_actor : public event_based_actor {
typedef std::function<void()> fun_type;
default_scheduled_actor(fun_type&& fun) : m_fun(std::move(fun)) { }
default_scheduled_actor(fun_type&& fun)
: super(actor_state::ready), m_fun(std::move(fun)), m_initialized(false) { }
void init() { }
void init() {
become (
on(atom("RUN")) >> [=] {
CPPA_LOGS_TRACE("init$lambda", "");
unbecome();
resume_result resume(util::fiber* f, actor_ptr& next) {
if (!m_initialized) {
scoped_self_setter sss{this};
m_initialized = true;
m_fun();
if (m_bhvr_stack.empty()) {
if (exit_reason() == exit_reason::not_exited) quit(exit_reason::normal);
set_state(actor_state::done);
m_bhvr_stack.clear();
m_bhvr_stack.cleanup();
on_exit();
next.swap(m_chained_actor);
set_state(actor_state::done);
return resume_result::actor_done;
}
}
);
return event_based_actor::resume(f, next);
}
scheduled_actor_type impl_type() {
......@@ -65,6 +79,7 @@ class default_scheduled_actor : public event_based_actor {
private:
fun_type m_fun;
bool m_initialized;
};
......@@ -72,7 +87,7 @@ intrusive_ptr<event_based_actor> event_based_actor::from(std::function<void()> f
return detail::memory::create<default_scheduled_actor>(std::move(fun));
}
event_based_actor::event_based_actor() : super(actor_state::blocked, true) { }
event_based_actor::event_based_actor(actor_state st) : super(st, true) { }
void event_based_actor::dequeue(behavior&) {
quit(exit_reason::unallowed_function_call);
......
......@@ -209,20 +209,10 @@ actor_ptr thread_pool_scheduler::exec(spawn_options os, scheduled_actor_ptr p) {
return std::move(p);
}
p->attach_to_scheduler(this, is_hidden);
if (p->has_behavior()) {
if (p->has_behavior() || p->impl_type() == default_event_based_impl) {
if (!is_hidden) get_actor_registry()->inc_running();
p->ref(); // implicit reference that's released if actor dies
switch (p->impl_type()) {
case default_event_based_impl: {
p->enqueue(nullptr, make_any_tuple(atom("RUN")));
break;
}
case context_switching_impl: {
m_queue.push_back(p.get());
break;
}
default: break; // nothing to do
}
if (p->impl_type() != event_based_impl) m_queue.push_back(p.get());
}
else p->on_exit();
return std::move(p);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment