Rev 1571 | Rev 1581 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1571 | Rev 1579 | ||
---|---|---|---|
Line 231... | Line 231... | ||
231 | * |
231 | * |
232 | * Assume thread->lock is held!! |
232 | * Assume thread->lock is held!! |
233 | */ |
233 | */ |
234 | void thread_destroy(thread_t *t) |
234 | void thread_destroy(thread_t *t) |
235 | { |
235 | { |
- | 236 | bool destroy_task = false; |
|
- | 237 | ||
236 | ASSERT(t->state == Exiting); |
238 | ASSERT(t->state == Exiting); |
237 | ASSERT(t->task); |
239 | ASSERT(t->task); |
238 | ASSERT(t->cpu); |
240 | ASSERT(t->cpu); |
239 | 241 | ||
240 | spinlock_lock(&t->cpu->lock); |
242 | spinlock_lock(&t->cpu->lock); |
241 | if(t->cpu->fpu_owner==t) |
243 | if(t->cpu->fpu_owner==t) |
242 | t->cpu->fpu_owner=NULL; |
244 | t->cpu->fpu_owner=NULL; |
243 | spinlock_unlock(&t->cpu->lock); |
245 | spinlock_unlock(&t->cpu->lock); |
244 | 246 | ||
- | 247 | spinlock_unlock(&t->lock); |
|
- | 248 | ||
- | 249 | spinlock_lock(&threads_lock); |
|
- | 250 | btree_remove(&threads_btree, (btree_key_t) ((__address ) t), NULL); |
|
- | 251 | spinlock_unlock(&threads_lock); |
|
- | 252 | ||
245 | /* |
253 | /* |
246 | * Detach from the containing task. |
254 | * Detach from the containing task. |
247 | */ |
255 | */ |
248 | spinlock_lock(&t->task->lock); |
256 | spinlock_lock(&t->task->lock); |
249 | list_remove(&t->th_link); |
257 | list_remove(&t->th_link); |
- | 258 | if (--t->task->refcount == 0) { |
|
- | 259 | t->task->accept_new_threads = false; |
|
- | 260 | destroy_task = true; |
|
- | 261 | } |
|
250 | spinlock_unlock(&t->task->lock); |
262 | spinlock_unlock(&t->task->lock); |
251 | 263 | ||
252 | spinlock_unlock(&t->lock); |
264 | if (destroy_task) |
253 | - | ||
254 | spinlock_lock(&threads_lock); |
265 | task_destroy(t->task); |
255 | btree_remove(&threads_btree, (btree_key_t) ((__address ) t), NULL); |
- | |
256 | spinlock_unlock(&threads_lock); |
- | |
257 | 266 | ||
258 | slab_free(thread_slab, t); |
267 | slab_free(thread_slab, t); |
259 | } |
268 | } |
260 | 269 | ||
261 | /** Create new thread |
270 | /** Create new thread |
Line 317... | Line 326... | ||
317 | t->sleep_queue = NULL; |
326 | t->sleep_queue = NULL; |
318 | t->timeout_pending = 0; |
327 | t->timeout_pending = 0; |
319 | 328 | ||
320 | t->in_copy_from_uspace = false; |
329 | t->in_copy_from_uspace = false; |
321 | t->in_copy_to_uspace = false; |
330 | t->in_copy_to_uspace = false; |
322 | 331 | ||
- | 332 | t->interrupted = false; |
|
323 | t->detached = false; |
333 | t->detached = false; |
324 | waitq_initialize(&t->join_wq); |
334 | waitq_initialize(&t->join_wq); |
325 | 335 | ||
326 | t->rwlock_holder_type = RWLOCK_NONE; |
336 | t->rwlock_holder_type = RWLOCK_NONE; |
327 | 337 | ||
Line 329... | Line 339... | ||
329 | 339 | ||
330 | t->fpu_context_exists = 0; |
340 | t->fpu_context_exists = 0; |
331 | t->fpu_context_engaged = 0; |
341 | t->fpu_context_engaged = 0; |
332 | 342 | ||
333 | /* |
343 | /* |
- | 344 | * Attach to the containing task. |
|
- | 345 | */ |
|
- | 346 | spinlock_lock(&task->lock); |
|
- | 347 | if (!task->accept_new_threads) { |
|
- | 348 | spinlock_unlock(&task->lock); |
|
- | 349 | slab_free(thread_slab, t); |
|
- | 350 | return NULL; |
|
- | 351 | } |
|
- | 352 | list_append(&t->th_link, &task->th_head); |
|
- | 353 | task->refcount++; |
|
- | 354 | spinlock_unlock(&task->lock); |
|
- | 355 | ||
- | 356 | /* |
|
334 | * Register this thread in the system-wide list. |
357 | * Register this thread in the system-wide list. |
335 | */ |
358 | */ |
336 | ipl = interrupts_disable(); |
359 | ipl = interrupts_disable(); |
337 | spinlock_lock(&threads_lock); |
360 | spinlock_lock(&threads_lock); |
338 | btree_insert(&threads_btree, (btree_key_t) ((__address) t), (void *) t, NULL); |
361 | btree_insert(&threads_btree, (btree_key_t) ((__address) t), (void *) t, NULL); |
339 | spinlock_unlock(&threads_lock); |
362 | spinlock_unlock(&threads_lock); |
340 | 363 | ||
341 | /* |
- | |
342 | * Attach to the containing task. |
- | |
343 | */ |
- | |
344 | spinlock_lock(&task->lock); |
- | |
345 | list_append(&t->th_link, &task->th_head); |
- | |
346 | spinlock_unlock(&task->lock); |
- | |
347 | - | ||
348 | interrupts_restore(ipl); |
364 | interrupts_restore(ipl); |
349 | 365 | ||
350 | return t; |
366 | return t; |
351 | } |
367 | } |
352 | 368 |