summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pfinet/sched.c35
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);
+}
+