diff options
Diffstat (limited to 'include/linux/wait.h')
-rw-r--r-- | include/linux/wait.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/include/linux/wait.h b/include/linux/wait.h index 76d96d035ea0..0836ccc57121 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
@@ -376,6 +376,155 @@ do { \ | |||
376 | __ret; \ | 376 | __ret; \ |
377 | }) | 377 | }) |
378 | 378 | ||
379 | |||
380 | #define __wait_event_interruptible_locked(wq, condition, exclusive, irq) \ | ||
381 | ({ \ | ||
382 | int __ret = 0; \ | ||
383 | DEFINE_WAIT(__wait); \ | ||
384 | if (exclusive) \ | ||
385 | __wait.flags |= WQ_FLAG_EXCLUSIVE; \ | ||
386 | do { \ | ||
387 | if (likely(list_empty(&__wait.task_list))) \ | ||
388 | __add_wait_queue_tail(&(wq), &__wait); \ | ||
389 | set_current_state(TASK_INTERRUPTIBLE); \ | ||
390 | if (signal_pending(current)) { \ | ||
391 | __ret = -ERESTARTSYS; \ | ||
392 | break; \ | ||
393 | } \ | ||
394 | if (irq) \ | ||
395 | spin_unlock_irq(&(wq).lock); \ | ||
396 | else \ | ||
397 | spin_unlock(&(wq).lock); \ | ||
398 | schedule(); \ | ||
399 | if (irq) \ | ||
400 | spin_lock_irq(&(wq).lock); \ | ||
401 | else \ | ||
402 | spin_lock(&(wq).lock); \ | ||
403 | } while (!(condition)); \ | ||
404 | __remove_wait_queue(&(wq), &__wait); \ | ||
405 | __set_current_state(TASK_RUNNING); \ | ||
406 | __ret; \ | ||
407 | }) | ||
408 | |||
409 | |||
410 | /** | ||
411 | * wait_event_interruptible_locked - sleep until a condition gets true | ||
412 | * @wq: the waitqueue to wait on | ||
413 | * @condition: a C expression for the event to wait for | ||
414 | * | ||
415 | * The process is put to sleep (TASK_INTERRUPTIBLE) until the | ||
416 | * @condition evaluates to true or a signal is received. | ||
417 | * The @condition is checked each time the waitqueue @wq is woken up. | ||
418 | * | ||
419 | * It must be called with wq.lock being held. This spinlock is | ||
420 | * unlocked while sleeping but @condition testing is done while lock | ||
421 | * is held and when this macro exits the lock is held. | ||
422 | * | ||
423 | * The lock is locked/unlocked using spin_lock()/spin_unlock() | ||
424 | * functions which must match the way they are locked/unlocked outside | ||
425 | * of this macro. | ||
426 | * | ||
427 | * wake_up_locked() has to be called after changing any variable that could | ||
428 | * change the result of the wait condition. | ||
429 | * | ||
430 | * The function will return -ERESTARTSYS if it was interrupted by a | ||
431 | * signal and 0 if @condition evaluated to true. | ||
432 | */ | ||
433 | #define wait_event_interruptible_locked(wq, condition) \ | ||
434 | ((condition) \ | ||
435 | ? 0 : __wait_event_interruptible_locked(wq, condition, 0, 0)) | ||
436 | |||
437 | /** | ||
438 | * wait_event_interruptible_locked_irq - sleep until a condition gets true | ||
439 | * @wq: the waitqueue to wait on | ||
440 | * @condition: a C expression for the event to wait for | ||
441 | * | ||
442 | * The process is put to sleep (TASK_INTERRUPTIBLE) until the | ||
443 | * @condition evaluates to true or a signal is received. | ||
444 | * The @condition is checked each time the waitqueue @wq is woken up. | ||
445 | * | ||
446 | * It must be called with wq.lock being held. This spinlock is | ||
447 | * unlocked while sleeping but @condition testing is done while lock | ||
448 | * is held and when this macro exits the lock is held. | ||
449 | * | ||
450 | * The lock is locked/unlocked using spin_lock_irq()/spin_unlock_irq() | ||
451 | * functions which must match the way they are locked/unlocked outside | ||
452 | * of this macro. | ||
453 | * | ||
454 | * wake_up_locked() has to be called after changing any variable that could | ||
455 | * change the result of the wait condition. | ||
456 | * | ||
457 | * The function will return -ERESTARTSYS if it was interrupted by a | ||
458 | * signal and 0 if @condition evaluated to true. | ||
459 | */ | ||
460 | #define wait_event_interruptible_locked_irq(wq, condition) \ | ||
461 | ((condition) \ | ||
462 | ? 0 : __wait_event_interruptible_locked(wq, condition, 0, 1)) | ||
463 | |||
464 | /** | ||
465 | * wait_event_interruptible_exclusive_locked - sleep exclusively until a condition gets true | ||
466 | * @wq: the waitqueue to wait on | ||
467 | * @condition: a C expression for the event to wait for | ||
468 | * | ||
469 | * The process is put to sleep (TASK_INTERRUPTIBLE) until the | ||
470 | * @condition evaluates to true or a signal is received. | ||
471 | * The @condition is checked each time the waitqueue @wq is woken up. | ||
472 | * | ||
473 | * It must be called with wq.lock being held. This spinlock is | ||
474 | * unlocked while sleeping but @condition testing is done while lock | ||
475 | * is held and when this macro exits the lock is held. | ||
476 | * | ||
477 | * The lock is locked/unlocked using spin_lock()/spin_unlock() | ||
478 | * functions which must match the way they are locked/unlocked outside | ||
479 | * of this macro. | ||
480 | * | ||
481 | * The process is put on the wait queue with an WQ_FLAG_EXCLUSIVE flag | ||
482 | * set thus when other process waits process on the list if this | ||
483 | * process is awaken further processes are not considered. | ||
484 | * | ||
485 | * wake_up_locked() has to be called after changing any variable that could | ||
486 | * change the result of the wait condition. | ||
487 | * | ||
488 | * The function will return -ERESTARTSYS if it was interrupted by a | ||
489 | * signal and 0 if @condition evaluated to true. | ||
490 | */ | ||
491 | #define wait_event_interruptible_exclusive_locked(wq, condition) \ | ||
492 | ((condition) \ | ||
493 | ? 0 : __wait_event_interruptible_locked(wq, condition, 1, 0)) | ||
494 | |||
495 | /** | ||
496 | * wait_event_interruptible_exclusive_locked_irq - sleep until a condition gets true | ||
497 | * @wq: the waitqueue to wait on | ||
498 | * @condition: a C expression for the event to wait for | ||
499 | * | ||
500 | * The process is put to sleep (TASK_INTERRUPTIBLE) until the | ||
501 | * @condition evaluates to true or a signal is received. | ||
502 | * The @condition is checked each time the waitqueue @wq is woken up. | ||
503 | * | ||
504 | * It must be called with wq.lock being held. This spinlock is | ||
505 | * unlocked while sleeping but @condition testing is done while lock | ||
506 | * is held and when this macro exits the lock is held. | ||
507 | * | ||
508 | * The lock is locked/unlocked using spin_lock_irq()/spin_unlock_irq() | ||
509 | * functions which must match the way they are locked/unlocked outside | ||
510 | * of this macro. | ||
511 | * | ||
512 | * The process is put on the wait queue with an WQ_FLAG_EXCLUSIVE flag | ||
513 | * set thus when other process waits process on the list if this | ||
514 | * process is awaken further processes are not considered. | ||
515 | * | ||
516 | * wake_up_locked() has to be called after changing any variable that could | ||
517 | * change the result of the wait condition. | ||
518 | * | ||
519 | * The function will return -ERESTARTSYS if it was interrupted by a | ||
520 | * signal and 0 if @condition evaluated to true. | ||
521 | */ | ||
522 | #define wait_event_interruptible_exclusive_locked_irq(wq, condition) \ | ||
523 | ((condition) \ | ||
524 | ? 0 : __wait_event_interruptible_locked(wq, condition, 1, 1)) | ||
525 | |||
526 | |||
527 | |||
379 | #define __wait_event_killable(wq, condition, ret) \ | 528 | #define __wait_event_killable(wq, condition, ret) \ |
380 | do { \ | 529 | do { \ |
381 | DEFINE_WAIT(__wait); \ | 530 | DEFINE_WAIT(__wait); \ |