/*
* timeout.c
*
*/
#include "thread.h"
/*
* __thread_process_timeouts()
*
* Look for threads that have timed out. This should be called
* under interrupt lock, before calling __schedule().
*/
void __thread_process_timeouts(void)
{
struct thread *curr = current();
struct thread_list *tp;
struct thread *t;
mstime_t now = ms_timer();
struct thread_block *block;
mstime_t timeout;
/* The current thread is obviously running, so no need to check... */
for (tp = curr->list.next; tp != &curr->list; tp = tp->next) {
t = container_of(tp, struct thread, list);
if ((block = t->blocked) && (timeout = block->timeout)) {
if ((mstimediff_t)(timeout - now) <= 0) {
struct semaphore *sem = block->semaphore;
/* Remove us from the queue and increase the count */
block->list.next->prev = block->list.prev;
block->list.prev->next = block->list.next;
sem->count++;
t->blocked = NULL;
block->timed_out = true;
__schedule(); /* Normally sets just __need_schedule */
}
}
}
}