Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2087 | ||
|---|---|---|---|
| Line 218... | Line 218... | ||
| 218 | * The sleep timed out. |
218 | * The sleep timed out. |
| 219 | * We just restore interrupt priority level. |
219 | * We just restore interrupt priority level. |
| 220 | */ |
220 | */ |
| 221 | case ESYNCH_OK_BLOCKED: |
221 | case ESYNCH_OK_BLOCKED: |
| 222 | /* |
222 | /* |
| 223 | * We were woken with rwl->readers_in already incremented. |
223 | * We were woken with rwl->readers_in already |
| - | 224 | * incremented. |
|
| - | 225 | * |
|
| 224 | * Note that this arrangement avoids race condition between |
226 | * Note that this arrangement avoids race condition |
| 225 | * two concurrent readers. (Race is avoided if 'exclusive' is |
227 | * between two concurrent readers. (Race is avoided if |
| 226 | * locked at the same time as 'readers_in' is incremented. |
228 | * 'exclusive' is locked at the same time as |
| 227 | * Same time means both events happen atomically when |
229 | * 'readers_in' is incremented. Same time means both |
| 228 | * rwl->lock is held.) |
230 | * events happen atomically when rwl->lock is held.) |
| 229 | */ |
231 | */ |
| 230 | interrupts_restore(ipl); |
232 | interrupts_restore(ipl); |
| 231 | break; |
233 | break; |
| 232 | case ESYNCH_OK_ATOMIC: |
234 | case ESYNCH_OK_ATOMIC: |
| 233 | panic("_mutex_lock_timeout()==ESYNCH_OK_ATOMIC\n"); |
235 | panic("_mutex_lock_timeout()==ESYNCH_OK_ATOMIC\n"); |
| Line 321... | Line 323... | ||
| 321 | bool one_more = true; |
323 | bool one_more = true; |
| 322 | 324 | ||
| 323 | spinlock_lock(&rwl->exclusive.sem.wq.lock); |
325 | spinlock_lock(&rwl->exclusive.sem.wq.lock); |
| 324 | 326 | ||
| 325 | if (!list_empty(&rwl->exclusive.sem.wq.head)) |
327 | if (!list_empty(&rwl->exclusive.sem.wq.head)) |
| 326 | t = list_get_instance(rwl->exclusive.sem.wq.head.next, thread_t, wq_link); |
328 | t = list_get_instance(rwl->exclusive.sem.wq.head.next, thread_t, |
| - | 329 | wq_link); |
|
| 327 | do { |
330 | do { |
| 328 | if (t) { |
331 | if (t) { |
| 329 | spinlock_lock(&t->lock); |
332 | spinlock_lock(&t->lock); |
| 330 | type = t->rwlock_holder_type; |
333 | type = t->rwlock_holder_type; |
| 331 | spinlock_unlock(&t->lock); |
334 | spinlock_unlock(&t->lock); |
| Line 341... | Line 344... | ||
| 341 | 344 | ||
| 342 | 345 | ||
| 343 | if (type == RWLOCK_READER) { |
346 | if (type == RWLOCK_READER) { |
| 344 | /* |
347 | /* |
| 345 | * Waking up a reader. |
348 | * Waking up a reader. |
| 346 | * We are responsible for incrementing rwl->readers_in for it. |
349 | * We are responsible for incrementing rwl->readers_in |
| - | 350 | * for it. |
|
| 347 | */ |
351 | */ |
| 348 | rwl->readers_in++; |
352 | rwl->readers_in++; |
| 349 | } |
353 | } |
| 350 | 354 | ||
| 351 | /* |
355 | /* |
| Line 358... | Line 362... | ||
| 358 | */ |
362 | */ |
| 359 | _waitq_wakeup_unsafe(&rwl->exclusive.sem.wq, WAKEUP_FIRST); |
363 | _waitq_wakeup_unsafe(&rwl->exclusive.sem.wq, WAKEUP_FIRST); |
| 360 | 364 | ||
| 361 | t = NULL; |
365 | t = NULL; |
| 362 | if (!list_empty(&rwl->exclusive.sem.wq.head)) { |
366 | if (!list_empty(&rwl->exclusive.sem.wq.head)) { |
| 363 | t = list_get_instance(rwl->exclusive.sem.wq.head.next, thread_t, wq_link); |
367 | t = list_get_instance(rwl->exclusive.sem.wq.head.next, |
| - | 368 | thread_t, wq_link); |
|
| 364 | if (t) { |
369 | if (t) { |
| 365 | spinlock_lock(&t->lock); |
370 | spinlock_lock(&t->lock); |
| 366 | if (t->rwlock_holder_type != RWLOCK_READER) |
371 | if (t->rwlock_holder_type != RWLOCK_READER) |
| 367 | one_more = false; |
372 | one_more = false; |
| 368 | spinlock_unlock(&t->lock); |
373 | spinlock_unlock(&t->lock); |