Home | History | Annotate | Download | only in thread
      1 /*
      2  * timeout.c
      3  *
      4  */
      5 
      6 #include "thread.h"
      7 
      8 /*
      9  * __thread_process_timeouts()
     10  *
     11  * Look for threads that have timed out.  This should be called
     12  * under interrupt lock, before calling __schedule().
     13  */
     14 void __thread_process_timeouts(void)
     15 {
     16     struct thread *curr = current();
     17     struct thread_list *tp;
     18     struct thread *t;
     19     mstime_t now = ms_timer();
     20     struct thread_block *block;
     21     mstime_t timeout;
     22 
     23     /* The current thread is obviously running, so no need to check... */
     24     for (tp = curr->list.next; tp != &curr->list; tp = tp->next) {
     25 	t = container_of(tp, struct thread, list);
     26 	if ((block = t->blocked) && (timeout = block->timeout)) {
     27 	    if ((mstimediff_t)(timeout - now) <= 0) {
     28 		struct semaphore *sem = block->semaphore;
     29 		/* Remove us from the queue and increase the count */
     30 		block->list.next->prev = block->list.prev;
     31 		block->list.prev->next = block->list.next;
     32 		sem->count++;
     33 
     34 		t->blocked = NULL;
     35 		block->timed_out = true;
     36 
     37 		__schedule();	/* Normally sets just __need_schedule */
     38 	    }
     39 	}
     40     }
     41 }
     42