From ba8d965054a5496d4346444d1e29e7c9cdd9ab67 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sat, 25 Jul 2015 01:46:53 +0200 Subject: kern: new function `thread_sleep_lock' * kern/sched_prim.c (thread_sleep_lock): New function. * kern/sched_prim.h (thread_sleep_lock): New delcaration. --- kern/sched_prim.c | 18 ++++++++++++++++++ kern/sched_prim.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/kern/sched_prim.c b/kern/sched_prim.c index e8f260e..e354a21 100644 --- a/kern/sched_prim.c +++ b/kern/sched_prim.c @@ -457,6 +457,24 @@ void thread_sleep( thread_block((void (*)()) 0); /* block ourselves */ } +/* + * thread_sleep_lock: + * + * Cause the current thread to wait until the specified event + * occurs. The specified lock is unlocked before releasing + * the cpu. (This is a convenient way to sleep without manually + * calling assert_wait). + */ +void thread_sleep_lock( + event_t event, + lock_t lock, + boolean_t interruptible) +{ + assert_wait(event, interruptible); /* assert event */ + lock_done(lock); /* release the lock */ + thread_block((void (*)()) 0); /* block ourselves */ +} + /* * thread_bind: * diff --git a/kern/sched_prim.h b/kern/sched_prim.h index 62698dc..83d4594 100644 --- a/kern/sched_prim.h +++ b/kern/sched_prim.h @@ -69,6 +69,10 @@ extern void thread_sleep( event_t event, simple_lock_t lock, boolean_t interruptible); +extern void thread_sleep_lock( + event_t event, + lock_t lock, + boolean_t interruptible); extern void thread_wakeup(void); /* for function pointers */ extern void thread_wakeup_prim( event_t event, -- cgit v1.2.3