W pliku include/linux/sched.h zdefiniowane są makra z rodziny wait_event. Różnią się one od funkcji sleep_on tym, że po powrocie do zablokowanego procesu nie zdejmują go odrazu z kolejki oczekiwania lecz sprawdzają, czy jest spełniony warunek podany w wywołaniu funkcji. Jeżeli nie to ponownie blokują wykonanie procesu.
Dla przykładu:
#define __wait_event(wq, condition) \ do { \ wait_queue_t __wait; \ init_waitqueue_entry(&__wait, current); \ add_wait_queue(&wq, &__wait); \ for (;;) { \ set_current_state(TASK_UNINTERRUPTIBLE); \ if (condition) \ break; \ schedule(); \ } \ current->state = TASK_RUNNING; \ remove_wait_queue(&wq, &__wait); \ } while (0) #define wait_event(wq, condition) \ do { \ if (condition) \ break; \ __wait_event(wq, condition); \ } while (0)