Aller au contenu

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 valeur 0 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.