Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1578 → Rev 1579

/kernel/trunk/generic/src/proc/thread.c
233,6 → 233,8
*/
void thread_destroy(thread_t *t)
{
bool destroy_task = false;
 
ASSERT(t->state == Exiting);
ASSERT(t->task);
ASSERT(t->cpu);
242,19 → 244,26
t->cpu->fpu_owner=NULL;
spinlock_unlock(&t->cpu->lock);
 
spinlock_unlock(&t->lock);
 
spinlock_lock(&threads_lock);
btree_remove(&threads_btree, (btree_key_t) ((__address ) t), NULL);
spinlock_unlock(&threads_lock);
 
/*
* Detach from the containing task.
*/
spinlock_lock(&t->task->lock);
list_remove(&t->th_link);
spinlock_unlock(&t->task->lock);
if (--t->task->refcount == 0) {
t->task->accept_new_threads = false;
destroy_task = true;
}
spinlock_unlock(&t->task->lock);
spinlock_unlock(&t->lock);
if (destroy_task)
task_destroy(t->task);
spinlock_lock(&threads_lock);
btree_remove(&threads_btree, (btree_key_t) ((__address ) t), NULL);
spinlock_unlock(&threads_lock);
slab_free(thread_slab, t);
}
 
319,7 → 328,8
 
t->in_copy_from_uspace = false;
t->in_copy_to_uspace = false;
 
t->interrupted = false;
t->detached = false;
waitq_initialize(&t->join_wq);
331,6 → 341,19
t->fpu_context_engaged = 0;
/*
* Attach to the containing task.
*/
spinlock_lock(&task->lock);
if (!task->accept_new_threads) {
spinlock_unlock(&task->lock);
slab_free(thread_slab, t);
return NULL;
}
list_append(&t->th_link, &task->th_head);
task->refcount++;
spinlock_unlock(&task->lock);
 
/*
* Register this thread in the system-wide list.
*/
ipl = interrupts_disable();
338,13 → 361,6
btree_insert(&threads_btree, (btree_key_t) ((__address) t), (void *) t, NULL);
spinlock_unlock(&threads_lock);
/*
* Attach to the containing task.
*/
spinlock_lock(&task->lock);
list_append(&t->th_link, &task->th_head);
spinlock_unlock(&task->lock);
interrupts_restore(ipl);
return t;