next up previous contents
Next: Zegary dynamiczne Up: Bezpośrednie wywoływanie schedule() Previous: Funkcje z rodziny sleep_on   Spis rzeczy

Makra z rodziny wait_event

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)



Ignacy Kowalczyk 2001-11-16