blob: c22517c64d96368f68b83a2c1724deff89c13ce7 [file] [log] [blame]
#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);
}