41,6 → 41,7 |
#include <proc/uarg.h> |
#include <mm/as.h> |
#include <mm/slab.h> |
#include <atomic.h> |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <arch.h> |
92,7 → 93,50 |
btree_create(&tasks_btree); |
} |
|
/** Kill all tasks except the current task. |
* |
*/ |
void task_done(void) |
{ |
task_t *t; |
do { /* Repeat until there are any tasks except TASK */ |
|
/* Messing with task structures, avoid deadlock */ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
|
t = NULL; |
link_t *cur; |
for (cur = tasks_btree.leaf_head.next; cur != &tasks_btree.leaf_head; cur = cur->next) { |
btree_node_t *node = list_get_instance(cur, btree_node_t, leaf_link); |
|
unsigned int i; |
for (i = 0; i < node->keys; i++) { |
if ((task_t *) node->value[i] != TASK) { |
t = (task_t *) node->value[i]; |
break; |
} |
} |
} |
|
if (t != NULL) { |
task_id_t id = t->taskid; |
|
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
|
#ifdef CONFIG_DEBUG |
printf("Killing task %llu\n", id); |
#endif |
task_kill(id); |
} else { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
} |
|
} while (t != NULL); |
} |
|
/** Create new task |
* |
* Create new task with no threads. |
140,11 → 184,8 |
|
/* |
* Increment address space reference count. |
* TODO: Reconsider the locking scheme. |
*/ |
mutex_lock(&as->lock); |
as->refcount++; |
mutex_unlock(&as->lock); |
atomic_inc(&as->refcount); |
|
spinlock_lock(&tasks_lock); |
|
166,15 → 207,8 |
task_destroy_arch(t); |
btree_destroy(&t->futexes); |
|
mutex_lock_active(&t->as->lock); |
if (--t->as->refcount == 0) { |
mutex_unlock(&t->as->lock); |
if (atomic_predec(&t->as->refcount) == 0) |
as_destroy(t->as); |
/* |
* t->as is destroyed. |
*/ |
} else |
mutex_unlock(&t->as->lock); |
|
free(t); |
TASK = NULL; |
382,7 → 416,7 |
link_t *cur; |
ipl_t ipl; |
|
/* Messing with thread structures, avoid deadlock */ |
/* Messing with task structures, avoid deadlock */ |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
|
408,7 → 442,7 |
char suffix; |
order(task_get_accounting(t), &cycles, &suffix); |
|
printf("%-6lld %-10s %-3ld %#10zx %#10zx %9llu%c %7zd " |
printf("%-6llu %-10s %-3ld %#10zx %#10zx %9llu%c %7zd " |
"%6zd", t->taskid, t->name, t->context, t, t->as, |
cycles, suffix, t->refcount, |
atomic_get(&t->active_calls)); |
495,7 → 529,7 |
|
ipc_cleanup(); |
futex_cleanup(); |
klog_printf("Cleanup of task %lld completed.", TASK->taskid); |
klog_printf("Cleanup of task %llu completed.", TASK->taskid); |
} |
|
/** Kernel thread used to kill the userspace task when its main thread exits. |