kernel: implement a generic object signalling system
This commit is contained in:
@@ -226,3 +226,35 @@ struct object *object_header(void *p)
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
void object_assert_signal(struct object *obj, uint32_t signals)
|
||||
{
|
||||
obj->ob_signals |= signals;
|
||||
wakeup_queue(&obj->ob_wq);
|
||||
}
|
||||
|
||||
void object_clear_signal(struct object *obj, uint32_t signals)
|
||||
{
|
||||
obj->ob_signals &= ~signals;
|
||||
}
|
||||
|
||||
void object_wait_signal(
|
||||
struct object *obj,
|
||||
uint32_t signals,
|
||||
unsigned long *irq_flags)
|
||||
{
|
||||
struct thread *self = current_thread();
|
||||
struct wait_item waiter;
|
||||
wait_item_init(&waiter, self);
|
||||
for (;;) {
|
||||
thread_wait_begin(&waiter, &obj->ob_wq);
|
||||
if (obj->ob_signals & signals) {
|
||||
break;
|
||||
}
|
||||
|
||||
object_unlock_irqrestore(obj, *irq_flags);
|
||||
schedule(SCHED_NORMAL);
|
||||
object_lock_irqsave(obj, irq_flags);
|
||||
}
|
||||
thread_wait_end(&waiter, &obj->ob_wq);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user