refactor(runtime/object): remove state field

This commit is contained in:
Leonardo de Moura 2018-08-16 20:46:14 -07:00
parent 584eddee01
commit 066fbf2d5b
2 changed files with 7 additions and 16 deletions

View file

@ -356,7 +356,6 @@ class task_manager {
void enqueue_core(task_object * t) {
inc_ref(t);
t->m_state = task_object::Queued;
m_queue[t->m_prio].push_back(t);
if (m_required_workers > 0)
spawn_worker();
@ -385,8 +384,6 @@ class task_manager {
task_object * t = dequeue();
lean_assert(get_rc(t) > 0);
lean_assert(t->m_state == task_object::Queued);
t->m_state = task_object::Running;
reset_heartbeat();
object * v = nullptr;
{
@ -402,8 +399,6 @@ class task_manager {
t->m_closure = nullptr;
t->m_value = v;
handle_finished(t);
} else {
t->m_state = task_object::Waiting;
}
reset_heartbeat();
notify_queue_changed();
@ -417,7 +412,6 @@ class task_manager {
}
void handle_finished(task_object * t) {
t->m_state = task_object::Done;
object * rev_deps = t->m_reverse_deps;
t->m_reverse_deps = nullptr;
@ -467,12 +461,12 @@ public:
}
void add_dep(task_object * t1, task_object * t2) {
if (t1->m_state == task_object::Done) {
if (t1->m_value) {
enqueue(t2);
return;
}
unique_lock<mutex> lock(m_mutex);
if (t1->m_state == task_object::Done) {
if (t1->m_value) {
enqueue_core(t2);
return;
}
@ -480,17 +474,16 @@ public:
inc_ref(t2);
cnstr_set_obj(new_list, 0, t2);
cnstr_set_obj(new_list, 1, t1->m_reverse_deps);
t2->m_state = task_object::Waiting;
t1->m_reverse_deps = new_list;
}
void wait_for(task_object * t) {
if (t->m_state == task_object::Done)
if (t->m_value)
return;
unique_lock<mutex> lock(m_mutex);
if (t->m_finished_cv == nullptr)
t->m_finished_cv = new condition_variable();
t->m_finished_cv->wait(lock, [&]() { return t->m_state == task_object::Done; });
t->m_finished_cv->wait(lock, [&]() { return t->m_value != nullptr; });
}
};
@ -514,12 +507,12 @@ scoped_task_manager::~scoped_task_manager() {
}
task_object::task_object(obj_arg c, unsigned prio):
object(object_kind::Task), m_closure(c), m_value(nullptr), m_reverse_deps(box(0)), m_state(Created), m_prio(prio), m_interrupted(false) {
object(object_kind::Task), m_closure(c), m_value(nullptr), m_reverse_deps(box(0)), m_prio(prio), m_interrupted(false) {
lean_assert(is_closure(c));
}
task_object::task_object(obj_arg v):
object(object_kind::Task), m_closure(nullptr), m_value(v), m_reverse_deps(box(0)), m_state(Done), m_prio(0), m_interrupted(false) {
object(object_kind::Task), m_closure(nullptr), m_value(v), m_reverse_deps(box(0)), m_prio(0), m_interrupted(false) {
}
task_object::~task_object() {
@ -586,7 +579,7 @@ b_obj_res task_get(b_obj_arg t) {
}
static obj_res task_bind_fn2(obj_arg t, obj_arg) {
lean_assert(to_task(t)->m_state == task_object::Done);
lean_assert(to_task(t)->m_value);
b_obj_res v = to_task(t)->m_value;
inc(v);
return v;

View file

@ -121,12 +121,10 @@ struct thunk_object : public object {
};
struct task_object : public object {
enum state { Created, Waiting, Queued, Running, Done };
object * m_closure;
atomic<object *> m_value;
object * m_reverse_deps; /* List of closures */
condition_variable * m_finished_cv{nullptr};
atomic<state> m_state;
unsigned m_prio;
atomic<bool> m_interrupted{false};
task_object(object * c, unsigned prio);