Changeset 9fe9d296 in mainline for kernel/generic/src/synch/waitq.c
- Timestamp:
- 2012-11-16T17:36:23Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 853d613
- Parents:
- 497bd656
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified kernel/generic/src/synch/waitq.c ¶
r497bd656 r9fe9d296 57 57 58 58 static void waitq_sleep_timed_out(void *); 59 static void waitq_complete_wakeup(waitq_t *); 60 59 61 60 62 /** Initialize wait queue … … 330 332 break; 331 333 default: 334 /* 335 * Wait for a waitq_wakeup() or waitq_unsleep() to complete 336 * before returning from waitq_sleep() to the caller. Otherwise 337 * the caller might expect that the wait queue is no longer used 338 * and deallocate it (although the wakeup on a another cpu has 339 * not yet completed and is using the wait queue). 340 * 341 * Note that we have to do this for ESYNCH_OK_BLOCKED and 342 * ESYNCH_INTERRUPTED, but not necessarily for ESYNCH_TIMEOUT 343 * where the timeout handler stops using the waitq before waking 344 * us up. To be on the safe side, ensure the waitq is not in use 345 * anymore in this case as well. 346 */ 347 waitq_complete_wakeup(wq); 332 348 break; 333 349 } … … 357 373 } else { 358 374 if (PARAM_NON_BLOCKING(flags, usec)) { 359 /* Return immediatel ly instead of going to sleep */375 /* Return immediately instead of going to sleep */ 360 376 return ESYNCH_WOULD_BLOCK; 361 377 } … … 448 464 * exits. It returns immediately if there are no concurrent wakeups 449 465 * at the time. 466 * 467 * Interrupts must be disabled. 450 468 * 451 469 * Example usage: … … 466 484 * // callback() completed its work, but it may still be accessing 467 485 * // wq in waitq_wakeup(). Therefore it is not yet safe to return 468 * // or it would clobber up our stack (where wq is stored). 469 * waitq_complete_wakeup(&wq); 470 * // waitq_wakeup() is complete, it is safe to free wq. 486 * // from waitq_sleep() or it would clobber up our stack (where wq 487 * // is stored). waitq_sleep() ensures the wait queue is no longer 488 * // in use by invoking waitq_complete_wakeup() internally. 489 * 490 * // waitq_sleep() returned, it is safe to free wq. 471 491 * } 472 492 * @endcode … … 474 494 * @param wq Pointer to a wait queue. 475 495 */ 476 void waitq_complete_wakeup(waitq_t *wq) 477 { 478 irq_spinlock_lock(&wq->lock, true); 479 irq_spinlock_unlock(&wq->lock, true); 496 static void waitq_complete_wakeup(waitq_t *wq) 497 { 498 ASSERT(interrupts_disabled()); 499 500 irq_spinlock_lock(&wq->lock, false); 501 irq_spinlock_unlock(&wq->lock, false); 480 502 } 481 503
Note:
See TracChangeset
for help on using the changeset viewer.