| /* |
| * 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 */ |
| } |
| } |
| } |
| } |