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)