summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1995-11-20 20:55:27 +0000
committerMichael I. Bushnell <mib@gnu.org>1995-11-20 20:55:27 +0000
commitdb5d0a9876660e53cea7cc03c67e516a84c169e8 (patch)
treeaf78e8b375ba5a82c5eee650b6ab0b116e5f7eee
parentaaa2f7d8d5d5aad4b25a945c4a6d685b2d9dfc08 (diff)
Formerly timer-emul.c.~5~
-rw-r--r--pfinet/timer-emul.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/pfinet/timer-emul.c b/pfinet/timer-emul.c
index 7b7064d7..d543ec5e 100644
--- a/pfinet/timer-emul.c
+++ b/pfinet/timer-emul.c
@@ -26,38 +26,23 @@
long long root_jiffies;
volatile struct mapped_time_value *mapped_time;
-static void
-timer_function (any_t timerp)
-{
- struct timer_list *timer = timerp;
- mach_port_t recv;
- error_t err;
-
- recv = mach_reply_port ();
-
- timer->thread = mach_thread_self ();
+static spin_lock_t timer_lock;
+struct timer_list *timers;
+mach_thread_t timer_thread;
err = mach_msg (NULL, MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT,
0, 0, recv, timer->expires * (1000 / HZ), MACH_PORT_NULL);
- timer->thread = MACH_PORT_NULL;
-
- mach_port_destroy (mach_task_self (), recv);
-
- if (!err)
- {
- mutex_lock (&global_lock);
- (*timer->function)(timer->data);
- mutex_unlock (&global_lock);
- }
-}
-
void
add_timer (struct timer_list *timer)
{
- timer->thread = -1;
- cthread_detach (cthread_fork ((cthread_fn_t) timer_function, timer));
+ spin_lock (&timer_lock);
+
+ timer->expires += jiffies;
+
+
+ spin_unlock (&timer_lock);
}
int
@@ -65,6 +50,24 @@ del_timer (struct timer_list *timer)
{
thread_t thread;
+ spin_lock (&timer_lock);
+
+ recheck:
+ switch (timer->state)
+ {
+ case TIMER_INACTIVE:
+ break;
+
+ case TIMER_STARTING:
+ /* Wait until it's had a chance to set its ID. */
+ spin_unlock (&timer_lock);
+ swtch_pri (0);
+ spin_lock (&timer_lock);
+ goto recheck;
+
+ case TIMER_STARTED:
+ /*
+
if (timer->thread == -1)
{
@@ -97,7 +100,7 @@ del_timer (struct timer_list *timer)
void
init_timer (struct timer_list *timer)
{
- timer->thread = MACH_PORT_NULL;
+ timer->state = TIMER_INACTIVE;
}
void