Rev 411 | Rev 430 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 411 | Rev 413 | ||
---|---|---|---|
Line 98... | Line 98... | ||
98 | */ |
98 | */ |
99 | void timeout_register(timeout_t *t, __u64 time, timeout_handler_t f, void *arg) |
99 | void timeout_register(timeout_t *t, __u64 time, timeout_handler_t f, void *arg) |
100 | { |
100 | { |
101 | timeout_t *hlp; |
101 | timeout_t *hlp; |
102 | link_t *l, *m; |
102 | link_t *l, *m; |
103 | pri_t pri; |
103 | ipl_t ipl; |
104 | __u64 sum; |
104 | __u64 sum; |
105 | 105 | ||
106 | pri = cpu_priority_high(); |
106 | ipl = interrupts_disable(); |
107 | spinlock_lock(&CPU->timeoutlock); |
107 | spinlock_lock(&CPU->timeoutlock); |
108 | spinlock_lock(&t->lock); |
108 | spinlock_lock(&t->lock); |
109 | 109 | ||
110 | if (t->cpu) |
110 | if (t->cpu) |
111 | panic("t->cpu != 0"); |
111 | panic("t->cpu != 0"); |
Line 150... | Line 150... | ||
150 | spinlock_unlock(&hlp->lock); |
150 | spinlock_unlock(&hlp->lock); |
151 | } |
151 | } |
152 | 152 | ||
153 | spinlock_unlock(&t->lock); |
153 | spinlock_unlock(&t->lock); |
154 | spinlock_unlock(&CPU->timeoutlock); |
154 | spinlock_unlock(&CPU->timeoutlock); |
155 | cpu_priority_restore(pri); |
155 | interrupts_restore(ipl); |
156 | } |
156 | } |
157 | 157 | ||
158 | 158 | ||
159 | /** Unregister timeout |
159 | /** Unregister timeout |
160 | * |
160 | * |
Line 166... | Line 166... | ||
166 | */ |
166 | */ |
167 | bool timeout_unregister(timeout_t *t) |
167 | bool timeout_unregister(timeout_t *t) |
168 | { |
168 | { |
169 | timeout_t *hlp; |
169 | timeout_t *hlp; |
170 | link_t *l; |
170 | link_t *l; |
171 | pri_t pri; |
171 | ipl_t ipl; |
172 | 172 | ||
173 | grab_locks: |
173 | grab_locks: |
174 | pri = cpu_priority_high(); |
174 | ipl = interrupts_disable(); |
175 | spinlock_lock(&t->lock); |
175 | spinlock_lock(&t->lock); |
176 | if (!t->cpu) { |
176 | if (!t->cpu) { |
177 | spinlock_unlock(&t->lock); |
177 | spinlock_unlock(&t->lock); |
178 | cpu_priority_restore(pri); |
178 | interrupts_restore(ipl); |
179 | return false; |
179 | return false; |
180 | } |
180 | } |
181 | if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
181 | if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
182 | spinlock_unlock(&t->lock); |
182 | spinlock_unlock(&t->lock); |
183 | cpu_priority_restore(pri); |
183 | interrupts_restore(ipl); |
184 | goto grab_locks; |
184 | goto grab_locks; |
185 | } |
185 | } |
186 | 186 | ||
187 | /* |
187 | /* |
188 | * Now we know for sure that t hasn't been activated yet |
188 | * Now we know for sure that t hasn't been activated yet |
Line 201... | Line 201... | ||
201 | spinlock_unlock(&t->cpu->timeoutlock); |
201 | spinlock_unlock(&t->cpu->timeoutlock); |
202 | 202 | ||
203 | timeout_reinitialize(t); |
203 | timeout_reinitialize(t); |
204 | spinlock_unlock(&t->lock); |
204 | spinlock_unlock(&t->lock); |
205 | 205 | ||
206 | cpu_priority_restore(pri); |
206 | interrupts_restore(ipl); |
207 | return true; |
207 | return true; |
208 | } |
208 | } |