Rev 2307 | Rev 2416 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2307 | Rev 2336 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * Copyright (c) 2001-2004 Jakub Jermar |
2 | * Copyright (C) 2001-2004 Jakub Jermar |
3 | * All rights reserved. |
3 | * All rights reserved. |
4 | * |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
7 | * are met: |
Line 43... | Line 43... | ||
43 | #include <func.h> |
43 | #include <func.h> |
44 | #include <cpu.h> |
44 | #include <cpu.h> |
45 | #include <arch/asm.h> |
45 | #include <arch/asm.h> |
46 | #include <arch.h> |
46 | #include <arch.h> |
47 | 47 | ||
- | 48 | ||
48 | /** Initialize timeouts |
49 | /** Initialize timeouts |
49 | * |
50 | * |
50 | * Initialize kernel timeouts. |
51 | * Initialize kernel timeouts. |
51 | * |
52 | * |
52 | */ |
53 | */ |
53 | void timeout_init(void) |
54 | void timeout_init(void) |
54 | { |
55 | { |
55 | spinlock_initialize(&CPU->timeoutlock, "timeout_lock"); |
56 | spinlock_initialize(&CPU->timeoutlock, "timeout_lock"); |
- | 57 | ||
- | 58 | #ifdef CONFIG_TIMEOUT_EXTAVL_TREE |
|
- | 59 | extavltree_create(&CPU->timeout_active_tree); |
|
- | 60 | #else |
|
56 | list_initialize(&CPU->timeout_active_head); |
61 | list_initialize(&CPU->timeout_active_head); |
- | 62 | #endif |
|
57 | } |
63 | } |
58 | 64 | ||
59 | 65 | ||
60 | /** Reinitialize timeout |
66 | /** Reinitialize timeout |
61 | * |
67 | * |
Line 65... | Line 71... | ||
65 | * |
71 | * |
66 | */ |
72 | */ |
67 | void timeout_reinitialize(timeout_t *t) |
73 | void timeout_reinitialize(timeout_t *t) |
68 | { |
74 | { |
69 | t->cpu = NULL; |
75 | t->cpu = NULL; |
70 | t->ticks = 0; |
- | |
71 | t->handler = NULL; |
76 | t->handler = NULL; |
72 | t->arg = NULL; |
77 | t->arg = NULL; |
- | 78 | ||
- | 79 | #ifdef CONFIG_TIMEOUT_EXTAVL_TREE |
|
- | 80 | extavltree_node_initialize(&t->node); |
|
- | 81 | #else |
|
- | 82 | t->ticks = 0; |
|
73 | link_initialize(&t->link); |
83 | link_initialize(&t->link); |
- | 84 | #endif |
|
74 | } |
85 | } |
75 | 86 | ||
76 | 87 | ||
77 | /** Initialize timeout |
88 | /** Initialize timeout |
78 | * |
89 | * |
Line 85... | Line 96... | ||
85 | { |
96 | { |
86 | spinlock_initialize(&t->lock, "timeout_t_lock"); |
97 | spinlock_initialize(&t->lock, "timeout_t_lock"); |
87 | timeout_reinitialize(t); |
98 | timeout_reinitialize(t); |
88 | } |
99 | } |
89 | 100 | ||
- | 101 | #ifdef CONFIG_TIMEOUT_EXTAVL_TREE |
|
- | 102 | /** Register timeout |
|
- | 103 | * |
|
- | 104 | * Insert timeout handler f (with argument arg) |
|
- | 105 | * to timeout list and make it execute in |
|
- | 106 | * time microseconds (or slightly more). |
|
- | 107 | * |
|
- | 108 | * @param t Timeout structure. |
|
- | 109 | * @param time Number of usec in the future to execute |
|
- | 110 | * the handler. |
|
- | 111 | * @param f Timeout handler function. |
|
- | 112 | * @param arg Timeout handler argument. |
|
- | 113 | * |
|
- | 114 | */ |
|
- | 115 | void timeout_register(timeout_t *t, uint64_t time, timeout_handler_t f, void *arg) |
|
- | 116 | { |
|
- | 117 | ipl_t ipl; |
|
- | 118 | ||
- | 119 | ipl = interrupts_disable(); |
|
- | 120 | spinlock_lock(&CPU->timeoutlock); |
|
- | 121 | spinlock_lock(&t->lock); |
|
- | 122 | ||
- | 123 | if (t->cpu) |
|
- | 124 | panic("t->cpu != 0"); |
|
- | 125 | ||
- | 126 | t->cpu = CPU; |
|
- | 127 | ||
- | 128 | //tiky nejsou, musim zmenit klice primo v uzlech |
|
- | 129 | ||
- | 130 | t->handler = f; |
|
- | 131 | t->arg = arg; |
|
- | 132 | ||
- | 133 | extavltree_insert(&CPU->timeout_active_tree,&t->node); |
|
- | 134 | ||
- | 135 | spinlock_unlock(&t->lock); |
|
- | 136 | spinlock_unlock(&CPU->timeoutlock); |
|
- | 137 | interrupts_restore(ipl); |
|
- | 138 | } |
|
- | 139 | ||
- | 140 | ||
- | 141 | /** Unregister timeout |
|
- | 142 | * |
|
- | 143 | * Remove timeout from timeout list. |
|
- | 144 | * |
|
- | 145 | * @param t Timeout to unregister. |
|
- | 146 | * |
|
- | 147 | * @return true on success, false on failure. |
|
- | 148 | */ |
|
- | 149 | bool timeout_unregister(timeout_t *t) |
|
- | 150 | { |
|
- | 151 | ipl_t ipl; |
|
- | 152 | ||
- | 153 | grab_locks: |
|
- | 154 | ipl = interrupts_disable(); |
|
- | 155 | spinlock_lock(&t->lock); |
|
- | 156 | if (!t->cpu) { |
|
- | 157 | spinlock_unlock(&t->lock); |
|
- | 158 | interrupts_restore(ipl); |
|
- | 159 | return false; |
|
- | 160 | } |
|
- | 161 | if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
|
- | 162 | spinlock_unlock(&t->lock); |
|
- | 163 | interrupts_restore(ipl); |
|
- | 164 | goto grab_locks; |
|
- | 165 | } |
|
- | 166 | ||
- | 167 | /* |
|
- | 168 | * Now we know for sure that t hasn't been activated yet |
|
- | 169 | * and is lurking in t->cpu->timeout_active_head queue. |
|
- | 170 | */ |
|
- | 171 | ||
- | 172 | extavltree_delete(&CPU->timeout_active_tree,&t->node); |
|
- | 173 | ||
- | 174 | spinlock_unlock(&t->cpu->timeoutlock); |
|
- | 175 | ||
- | 176 | timeout_reinitialize(t); |
|
- | 177 | spinlock_unlock(&t->lock); |
|
- | 178 | ||
- | 179 | interrupts_restore(ipl); |
|
- | 180 | return true; |
|
- | 181 | } |
|
- | 182 | ||
- | 183 | #else |
|
90 | 184 | ||
91 | /** Register timeout |
185 | /** Register timeout |
92 | * |
186 | * |
93 | * Insert timeout handler f (with argument arg) |
187 | * Insert timeout handler f (with argument arg) |
94 | * to timeout list and make it execute in |
188 | * to timeout list and make it execute in |
Line 172... | Line 266... | ||
172 | bool timeout_unregister(timeout_t *t) |
266 | bool timeout_unregister(timeout_t *t) |
173 | { |
267 | { |
174 | timeout_t *hlp; |
268 | timeout_t *hlp; |
175 | link_t *l; |
269 | link_t *l; |
176 | ipl_t ipl; |
270 | ipl_t ipl; |
177 | DEADLOCK_PROBE_INIT(p_tolock); |
- | |
178 | 271 | ||
179 | grab_locks: |
272 | grab_locks: |
180 | ipl = interrupts_disable(); |
273 | ipl = interrupts_disable(); |
181 | spinlock_lock(&t->lock); |
274 | spinlock_lock(&t->lock); |
182 | if (!t->cpu) { |
275 | if (!t->cpu) { |
Line 184... | Line 277... | ||
184 | interrupts_restore(ipl); |
277 | interrupts_restore(ipl); |
185 | return false; |
278 | return false; |
186 | } |
279 | } |
187 | if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
280 | if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
188 | spinlock_unlock(&t->lock); |
281 | spinlock_unlock(&t->lock); |
189 | interrupts_restore(ipl); |
282 | interrupts_restore(ipl); |
190 | DEADLOCK_PROBE(p_tolock, DEADLOCK_THRESHOLD); |
- | |
191 | goto grab_locks; |
283 | goto grab_locks; |
192 | } |
284 | } |
193 | 285 | ||
194 | /* |
286 | /* |
195 | * Now we know for sure that t hasn't been activated yet |
287 | * Now we know for sure that t hasn't been activated yet |
Line 212... | Line 304... | ||
212 | 304 | ||
213 | interrupts_restore(ipl); |
305 | interrupts_restore(ipl); |
214 | return true; |
306 | return true; |
215 | } |
307 | } |
216 | 308 | ||
- | 309 | #endif |
|
217 | /** @} |
310 | /** @} |
218 | */ |
311 | */ |