diff options
author | Matt Fleming <matt.fleming@intel.com> | 2013-03-06 17:10:32 +0000 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2013-03-06 17:10:32 +0000 |
commit | 4153b9005c460e02d36c457367a045444812bb97 (patch) | |
tree | d6f41a24f4f58d0c85725f61aea0e5deba6d21cd /core/thread/timeout.c | |
parent | 12eafad11c9c68c979309087d71f1c76e3f1c4b9 (diff) | |
parent | 16aa878d78086e9bc1c1f1053dc24da295f81e05 (diff) | |
download | syslinux-5.10-pre1.tar.gz |
Merge branch 'lwip-merge' into elflinksyslinux-5.10-pre1
Diffstat (limited to 'core/thread/timeout.c')
-rw-r--r-- | core/thread/timeout.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/core/thread/timeout.c b/core/thread/timeout.c new file mode 100644 index 00000000..409ad6d7 --- /dev/null +++ b/core/thread/timeout.c @@ -0,0 +1,41 @@ +/* + * 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 */ + } + } + } +} |