Rev 1585 | Rev 1588 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1585 | Rev 1587 | ||
|---|---|---|---|
| Line 138... | Line 138... | ||
| 138 | * |
138 | * |
| 139 | * @param t Task to be destroyed. |
139 | * @param t Task to be destroyed. |
| 140 | */ |
140 | */ |
| 141 | void task_destroy(task_t *t) |
141 | void task_destroy(task_t *t) |
| 142 | { |
142 | { |
| - | 143 | spinlock_lock(&tasks_lock); |
|
| - | 144 | btree_remove(&tasks_btree, t->taskid, NULL); |
|
| - | 145 | spinlock_unlock(&tasks_lock); |
|
| - | 146 | ||
| - | 147 | task_destroy_arch(t); |
|
| - | 148 | btree_destroy(&t->futexes); |
|
| - | 149 | ||
| - | 150 | mutex_lock_active(&t->as->lock); |
|
| - | 151 | if (--t->as->refcount == 0) { |
|
| - | 152 | mutex_unlock(&t->as->lock); |
|
| - | 153 | as_destroy(t->as); |
|
| - | 154 | /* |
|
| - | 155 | * t->as is destroyed. |
|
| - | 156 | */ |
|
| - | 157 | } else { |
|
| - | 158 | mutex_unlock(&t->as->lock); |
|
| - | 159 | } |
|
| - | 160 | ||
| - | 161 | free(t); |
|
| - | 162 | TASK = NULL; |
|
| 143 | } |
163 | } |
| 144 | 164 | ||
| 145 | /** Create new task with 1 thread and run it |
165 | /** Create new task with 1 thread and run it |
| 146 | * |
166 | * |
| 147 | * @param program_addr Address of program executable image. |
167 | * @param program_addr Address of program executable image. |
| Line 256... | Line 276... | ||
| 256 | } |
276 | } |
| 257 | 277 | ||
| 258 | spinlock_lock(&ta->lock); |
278 | spinlock_lock(&ta->lock); |
| 259 | ta->refcount++; |
279 | ta->refcount++; |
| 260 | spinlock_unlock(&ta->lock); |
280 | spinlock_unlock(&ta->lock); |
| - | 281 | ||
| - | 282 | spinlock_unlock(&tasks_lock); |
|
| 261 | 283 | ||
| 262 | t = thread_create(ktaskclnp, NULL, ta, 0, "ktaskclnp"); |
284 | t = thread_create(ktaskclnp, NULL, ta, 0, "ktaskclnp"); |
| 263 | 285 | ||
| 264 | spinlock_lock(&ta->lock); |
286 | spinlock_lock(&ta->lock); |
| 265 | ta->accept_new_threads = false; |
287 | ta->accept_new_threads = false; |