Mise en sommeil
Dans les applications temps-réel il existe une multitude de raisons pour mettre en sommeil un processus ou un thread.
La plus courante est l’attente de données d’un périphérique d’entrées/sorties.
Les waitqueues
Les waitqueues permettent de mettre en sommeil un processus ou un thread et de le réveiller lors de l’arrivée de l’événement.
L’interface<linux/wait.h> propose les services reliés aux waitqueues
- Initialisation statique d’une
waitqueueDECLARE_WAIT_QUEUE_HEAD(queue); - Initialisation dynamique d’une waitqueue
void init_waitqueue_head (wait_queue_head_t* queue);
Quelques macros pour mettre en sommeil un thread
- Opération pour mettre en sommeil le thread jusqu’à la queue soit
notifiée et que la condition
Csoit vraie. Attention: ce service ne peut pas être interrompu, empêchant la destruction du processus en espace utilisateur.wait_event (queue, condition); - Idem, mais peut être interrompu par le signal
SIGKILL. Si le thread a été interrompu, la valeur-ERESTARTSYSest retournée.int wait_event_killable (queue, condition); - Idem, mais peut être interrompu par n’importe quel signal.
Si le thread a été interrompu, la valeur
-ERESTARTSYSest retournée.int wait_event_interruptible (queue, condition); - Opération pour mettre en sommeil le thread jusqu’à la queue soit notifiée
et que la condition
Csoit vraie ou bien que le temps soit écoulé. La valeur0est retournée si le temps est écoulé. (timeout en jiffies, 1 - 10ms)int wait_event_timeout (queue, condition, timeout); - Idem, mais peut être interrompu par n’importe quel signal.
La valeur
0est retournée si le temps est écoulé, si le thread a été interrompu, la valeur-ERESTARSYSest retournée, sinon une valeur positive.int wait_event_interruptible_timeout (queue, condition, timeout);
Quelques macros pour réveiller le thread
- Opération pour réveiller tous les processus dans la queue
wake_up(&queue); - Opération pour ne réveiller que les processus interruptibles de la queue.
wake_up_interruptible (&queue);
D’autres opérations sont disponibles dans l’interface.