[4] | 1 | /* FS timers library
|
---|
| 2 | */
|
---|
| 3 |
|
---|
| 4 | #include "fs.h"
|
---|
| 5 |
|
---|
| 6 | #include <timers.h>
|
---|
| 7 | #include <minix/syslib.h>
|
---|
| 8 | #include <minix/com.h>
|
---|
| 9 |
|
---|
| 10 | PRIVATE timer_t *fs_timers = NULL;
|
---|
| 11 |
|
---|
| 12 | PUBLIC void fs_set_timer(timer_t *tp, int ticks, tmr_func_t watchdog, int arg)
|
---|
| 13 | {
|
---|
| 14 | int r;
|
---|
| 15 | clock_t now, old_head = 0, new_head;
|
---|
| 16 |
|
---|
| 17 | if ((r = getuptime(&now)) != OK)
|
---|
| 18 | panic(__FILE__, "FS couldn't get uptime from system task.", NO_NUM);
|
---|
| 19 |
|
---|
| 20 | tmr_arg(tp)->ta_int = arg;
|
---|
| 21 |
|
---|
| 22 | old_head = tmrs_settimer(&fs_timers, tp, now+ticks, watchdog, &new_head);
|
---|
| 23 |
|
---|
| 24 | /* reschedule our synchronous alarm if necessary */
|
---|
| 25 | if (!old_head || old_head > new_head) {
|
---|
| 26 | if (sys_setalarm(new_head, 1) != OK)
|
---|
| 27 | panic(__FILE__, "FS set timer "
|
---|
| 28 | "couldn't set synchronous alarm.", NO_NUM);
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | return;
|
---|
| 32 | }
|
---|
| 33 |
|
---|
| 34 | PUBLIC void fs_expire_timers(clock_t now)
|
---|
| 35 | {
|
---|
| 36 | clock_t new_head;
|
---|
| 37 | tmrs_exptimers(&fs_timers, now, &new_head);
|
---|
| 38 | if (new_head > 0) {
|
---|
| 39 | if (sys_setalarm(new_head, 1) != OK)
|
---|
| 40 | panic(__FILE__, "FS expire timer couldn't set "
|
---|
| 41 | "synchronous alarm.", NO_NUM);
|
---|
| 42 | }
|
---|
| 43 | }
|
---|
| 44 |
|
---|
| 45 | PUBLIC void fs_init_timer(timer_t *tp)
|
---|
| 46 | {
|
---|
| 47 | tmr_inittimer(tp);
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | PUBLIC void fs_cancel_timer(timer_t *tp)
|
---|
| 51 | {
|
---|
| 52 | clock_t new_head, old_head;
|
---|
| 53 | old_head = tmrs_clrtimer(&fs_timers, tp, &new_head);
|
---|
| 54 |
|
---|
| 55 | /* if the earliest timer has been removed, we have to set
|
---|
| 56 | * the synalarm to the next timer, or cancel the synalarm
|
---|
| 57 | * altogether if th last time has been cancelled (new_head
|
---|
| 58 | * will be 0 then).
|
---|
| 59 | */
|
---|
| 60 | if (old_head < new_head || !new_head) {
|
---|
| 61 | if (sys_setalarm(new_head, 1) != OK)
|
---|
| 62 | panic(__FILE__,
|
---|
| 63 | "FS expire timer couldn't set synchronous alarm.",
|
---|
| 64 | NO_NUM);
|
---|
| 65 | }
|
---|
| 66 | }
|
---|