Null rust_task::cond on wakeup, add asserts and logging to block/wakeup.
This commit is contained in:
committed by
Graydon Hoare
parent
e327aa5093
commit
5db5eb0c55
@@ -529,23 +529,29 @@ rust_task::transition(ptr_vec<rust_task> *src, ptr_vec<rust_task> *dst)
|
|||||||
void
|
void
|
||||||
rust_task::block(rust_cond *on)
|
rust_task::block(rust_cond *on)
|
||||||
{
|
{
|
||||||
I(dom, on);
|
log(rust_log::TASK, "Blocking on 0x%" PRIxPTR ", cond: 0x%" PRIxPTR,
|
||||||
|
(uintptr_t) on, (uintptr_t) cond);
|
||||||
|
A(dom, cond == NULL, "Cannot block an already blocked task.");
|
||||||
|
A(dom, on != NULL, "Cannot block on a NULL object.");
|
||||||
|
|
||||||
transition(&dom->running_tasks, &dom->blocked_tasks);
|
transition(&dom->running_tasks, &dom->blocked_tasks);
|
||||||
dom->log(rust_log::TASK,
|
|
||||||
"task 0x%" PRIxPTR " blocking on 0x%" PRIxPTR,
|
|
||||||
(uintptr_t)this,
|
|
||||||
(uintptr_t)on);
|
|
||||||
cond = on;
|
cond = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rust_task::wakeup(rust_cond *from)
|
rust_task::wakeup(rust_cond *from)
|
||||||
{
|
{
|
||||||
|
A(dom, cond != NULL, "Cannot wake up unblocked task.");
|
||||||
|
log(rust_log::TASK, "Blocked on 0x%" PRIxPTR " woken up on 0x%" PRIxPTR,
|
||||||
|
(uintptr_t) cond, (uintptr_t) from);
|
||||||
|
A(dom, cond == from, "Cannot wake up blocked task on wrong condition.");
|
||||||
|
|
||||||
transition(&dom->blocked_tasks, &dom->running_tasks);
|
transition(&dom->blocked_tasks, &dom->running_tasks);
|
||||||
// TODO: Signaling every time the task is awaken is kind of silly,
|
// TODO: Signaling every time the task is awaken is kind of silly,
|
||||||
// do this a nicer way.
|
// do this a nicer way.
|
||||||
dom->_progress.signal();
|
dom->_progress.signal();
|
||||||
I(dom, cond == from);
|
I(dom, cond == from);
|
||||||
|
cond = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user