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 | }
|
---|