Rev 1 | Rev 68 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 15 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | #include <arch/asm.h> |
37 | #include <arch/asm.h> |
38 | #include <arch.h> |
38 | #include <arch.h> |
39 | 39 | ||
40 | void timeout_init(void) |
40 | void timeout_init(void) |
41 | { |
41 | { |
42 | spinlock_initialize(&the->cpu->timeoutlock); |
42 | spinlock_initialize(&CPU->timeoutlock); |
43 | list_initialize(&the->cpu->timeout_active_head); |
43 | list_initialize(&CPU->timeout_active_head); |
44 | } |
44 | } |
45 | 45 | ||
46 | 46 | ||
47 | void timeout_reinitialize(timeout_t *t) |
47 | void timeout_reinitialize(timeout_t *t) |
48 | { |
48 | { |
Line 68... | Line 68... | ||
68 | link_t *l, *m; |
68 | link_t *l, *m; |
69 | pri_t pri; |
69 | pri_t pri; |
70 | __u64 sum; |
70 | __u64 sum; |
71 | 71 | ||
72 | pri = cpu_priority_high(); |
72 | pri = cpu_priority_high(); |
73 | spinlock_lock(&the->cpu->timeoutlock); |
73 | spinlock_lock(&CPU->timeoutlock); |
74 | spinlock_lock(&t->lock); |
74 | spinlock_lock(&t->lock); |
75 | 75 | ||
76 | if (t->cpu) |
76 | if (t->cpu) |
77 | panic("timeout_register: t->cpu != 0"); |
77 | panic("timeout_register: t->cpu != 0"); |
78 | 78 | ||
79 | t->cpu = the->cpu; |
79 | t->cpu = CPU; |
80 | t->ticks = us2ticks(time); |
80 | t->ticks = us2ticks(time); |
81 | 81 | ||
82 | t->handler = f; |
82 | t->handler = f; |
83 | t->arg = arg; |
83 | t->arg = arg; |
84 | 84 | ||
85 | /* |
85 | /* |
86 | * Insert t into the active timeouts list according to t->ticks. |
86 | * Insert t into the active timeouts list according to t->ticks. |
87 | */ |
87 | */ |
88 | sum = 0; |
88 | sum = 0; |
89 | l = the->cpu->timeout_active_head.next; |
89 | l = CPU->timeout_active_head.next; |
90 | while (l != &the->cpu->timeout_active_head) { |
90 | while (l != &CPU->timeout_active_head) { |
91 | hlp = list_get_instance(l, timeout_t, link); |
91 | hlp = list_get_instance(l, timeout_t, link); |
92 | spinlock_lock(&hlp->lock); |
92 | spinlock_lock(&hlp->lock); |
93 | if (t->ticks < sum + hlp->ticks) { |
93 | if (t->ticks < sum + hlp->ticks) { |
94 | spinlock_unlock(&hlp->lock); |
94 | spinlock_unlock(&hlp->lock); |
95 | break; |
95 | break; |
Line 107... | Line 107... | ||
107 | t->ticks -= sum; |
107 | t->ticks -= sum; |
108 | 108 | ||
109 | /* |
109 | /* |
110 | * Decrease ticks of t's immediate succesor by t->ticks. |
110 | * Decrease ticks of t's immediate succesor by t->ticks. |
111 | */ |
111 | */ |
112 | if (l != &the->cpu->timeout_active_head) { |
112 | if (l != &CPU->timeout_active_head) { |
113 | spinlock_lock(&hlp->lock); |
113 | spinlock_lock(&hlp->lock); |
114 | hlp->ticks -= t->ticks; |
114 | hlp->ticks -= t->ticks; |
115 | spinlock_unlock(&hlp->lock); |
115 | spinlock_unlock(&hlp->lock); |
116 | } |
116 | } |
117 | 117 | ||
118 | spinlock_unlock(&t->lock); |
118 | spinlock_unlock(&t->lock); |
119 | spinlock_unlock(&the->cpu->timeoutlock); |
119 | spinlock_unlock(&CPU->timeoutlock); |
120 | cpu_priority_restore(pri); |
120 | cpu_priority_restore(pri); |
121 | } |
121 | } |
122 | 122 | ||
123 | int timeout_unregister(timeout_t *t) |
123 | int timeout_unregister(timeout_t *t) |
124 | { |
124 | { |