blob: c22517c64d96368f68b83a2c1724deff89c13ce7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#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);
}
|