summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1995-08-14 16:20:56 +0000
committerMichael I. Bushnell <mib@gnu.org>1995-08-14 16:20:56 +0000
commitbf7b08fcb66526d79977c36b33ea9e83c04689ef (patch)
tree217947643cfbb182b338a81fd56d31844184b9a1
parent8718af9bc0195f93ab62e0b44facc88ee62e834a (diff)
Formerly sched.c.~4~
-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);
+}
+