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
waitqueue
DECLARE_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
C
soit 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-ERESTARTSYS
est 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
-ERESTARTSYS
est 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
C
soit vraie ou bien que le temps soit écoulé. La valeur0
est 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
0
est retournée si le temps est écoulé, si le thread a été interrompu, la valeur-ERESTARSYS
est 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.