Changes in kernel/generic/src/time/timeout.c [b2e121a:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/time/timeout.c
rb2e121a ra35b458 103 103 irq_spinlock_lock(&CPU->timeoutlock, true); 104 104 irq_spinlock_lock(&timeout->lock, false); 105 105 106 106 if (timeout->cpu) 107 107 panic("Unexpected: timeout->cpu != 0."); 108 108 109 109 timeout->cpu = CPU; 110 110 timeout->ticks = us2ticks(time); 111 111 112 112 timeout->handler = handler; 113 113 timeout->arg = arg; 114 114 115 115 /* 116 116 * Insert timeout into the active timeouts list according to timeout->ticks. … … 123 123 target = list_get_instance(cur, timeout_t, link); 124 124 irq_spinlock_lock(&target->lock, false); 125 125 126 126 if (timeout->ticks < sum + target->ticks) { 127 127 irq_spinlock_unlock(&target->lock, false); 128 128 break; 129 129 } 130 130 131 131 sum += target->ticks; 132 132 irq_spinlock_unlock(&target->lock, false); 133 133 } 134 134 135 135 /* Avoid using cur->prev directly */ 136 136 link_t *prev = cur->prev; 137 137 list_insert_after(&timeout->link, prev); 138 138 139 139 /* 140 140 * Adjust timeout->ticks according to ticks … … 142 142 */ 143 143 timeout->ticks -= sum; 144 144 145 145 /* 146 146 * Decrease ticks of timeout's immediate succesor by timeout->ticks. … … 151 151 irq_spinlock_unlock(&target->lock, false); 152 152 } 153 153 154 154 irq_spinlock_unlock(&timeout->lock, false); 155 155 irq_spinlock_unlock(&CPU->timeoutlock, true); … … 168 168 { 169 169 DEADLOCK_PROBE_INIT(p_tolock); 170 170 171 171 grab_locks: 172 172 irq_spinlock_lock(&timeout->lock, true); … … 175 175 return false; 176 176 } 177 177 178 178 if (!irq_spinlock_trylock(&timeout->cpu->timeoutlock)) { 179 179 irq_spinlock_unlock(&timeout->lock, true); … … 181 181 goto grab_locks; 182 182 } 183 183 184 184 /* 185 185 * Now we know for sure that timeout hasn't been activated yet 186 186 * and is lurking in timeout->cpu->timeout_active_list. 187 187 */ 188 188 189 189 link_t *cur = timeout->link.next; 190 190 if (cur != &timeout->cpu->timeout_active_list.head) { … … 194 194 irq_spinlock_unlock(&tmp->lock, false); 195 195 } 196 196 197 197 list_remove(&timeout->link); 198 198 irq_spinlock_unlock(&timeout->cpu->timeoutlock, false); 199 199 200 200 timeout_reinitialize(timeout); 201 201 irq_spinlock_unlock(&timeout->lock, true); 202 202 203 203 return true; 204 204 }
Note:
See TracChangeset
for help on using the changeset viewer.