Subversion Repositories HelenOS

Rev

Rev 2118 | Rev 2216 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2118 Rev 2183
Line 39... Line 39...
39
#include <proc/thread.h>
39
#include <proc/thread.h>
40
#include <proc/task.h>
40
#include <proc/task.h>
41
#include <proc/uarg.h>
41
#include <proc/uarg.h>
42
#include <mm/as.h>
42
#include <mm/as.h>
43
#include <mm/slab.h>
43
#include <mm/slab.h>
-
 
44
#include <atomic.h>
44
#include <synch/spinlock.h>
45
#include <synch/spinlock.h>
45
#include <synch/waitq.h>
46
#include <synch/waitq.h>
46
#include <arch.h>
47
#include <arch.h>
47
#include <panic.h>
48
#include <panic.h>
48
#include <adt/btree.h>
49
#include <adt/btree.h>
Line 138... Line 139...
138
   
139
   
139
    ipl = interrupts_disable();
140
    ipl = interrupts_disable();
140
 
141
 
141
    /*
142
    /*
142
     * Increment address space reference count.
143
     * Increment address space reference count.
143
     * TODO: Reconsider the locking scheme.
-
 
144
     */
144
     */
145
    mutex_lock(&as->lock);
145
    atomic_inc(&as->refcount);
146
    as->refcount++;
-
 
147
    mutex_unlock(&as->lock);
-
 
148
 
146
 
149
    spinlock_lock(&tasks_lock);
147
    spinlock_lock(&tasks_lock);
150
 
148
 
151
    ta->taskid = ++task_counter;
149
    ta->taskid = ++task_counter;
152
    btree_insert(&tasks_btree, (btree_key_t) ta->taskid, (void *) ta, NULL);
150
    btree_insert(&tasks_btree, (btree_key_t) ta->taskid, (void *) ta, NULL);
Line 164... Line 162...
164
void task_destroy(task_t *t)
162
void task_destroy(task_t *t)
165
{
163
{
166
    task_destroy_arch(t);
164
    task_destroy_arch(t);
167
    btree_destroy(&t->futexes);
165
    btree_destroy(&t->futexes);
168
 
166
 
169
    mutex_lock_active(&t->as->lock);
-
 
170
    if (--t->as->refcount == 0) {
167
    if (atomic_predec(&t->as->refcount) == 0)
171
        mutex_unlock(&t->as->lock);
-
 
172
        as_destroy(t->as);
168
        as_destroy(t->as);
173
        /*
-
 
174
         * t->as is destroyed.
-
 
175
         */
-
 
176
    } else
-
 
177
        mutex_unlock(&t->as->lock);
-
 
178
   
169
   
179
    free(t);
170
    free(t);
180
    TASK = NULL;
171
    TASK = NULL;
181
}
172
}
182
 
173