43 lines
853 B
C
43 lines
853 B
C
#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);
|
|
}
|
|
|
|
|
|
|