diff options
-rw-r--r-- | pfinet/sched.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/pfinet/sched.c b/pfinet/sched.c index aadb6fbc..e48758c9 100644 --- a/pfinet/sched.c +++ b/pfinet/sched.c @@ -24,3 +24,38 @@ struct mutex global_interrupt_lock = MUTEX_INITIALIZER; struct task_struct *current; +struct mutex user_kernel_lock = MUTEX_INITIALIZER; + +/* Call this before doing kernel-level calls; this enforces the + non-preemptibility of the kernel. */ +void +start_kernel (struct task_struct *task) +{ + mutex_lock (&user_kernel_lock); + mutex_lock (&global_interrupt_lock); + current = task; + mutex_unlock (&global_interrupt_lock); +} + +/* Call this when done doing a kernel-level call. */ +void +end_kernel (void) +{ + mutex_lock (&global_interrupt_lock); + current = 0; + mutex_unlock (&global_interrupt_lock); + mutex_unlock (&user_kernel_lock); +} + +void +interruptible_sleep_on (struct wait_queue **p) +{ + condition_wait (&(*p)->c, &user_kernel_lock); +} + +void +wake_up_interruptible (struct wait_queue **p) +{ + condition_broadcast (&(*p)->c); +} + |