#include "thread.h" #include <limits.h> extern void __exit_thread(void); typedef void (*func_ptr)(void); void kill_thread(struct thread *thread) { irq_state_t irq; struct thread_block *block; if (thread == current()) __exit_thread(); irq = irq_save(); /* * Muck with the stack so that the next time the thread is run then * we end up going to __exit_thread. */ thread->esp->eip = __exit_thread; thread->prio = INT_MIN; block = thread->blocked; if (block) { 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++; thread->blocked = NULL; block->timed_out = true; /* Fake an immediate timeout */ } __schedule(); irq_restore(irq); }