Rev 3426 | Rev 3623 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3426 | Rev 3431 | ||
---|---|---|---|
Line 178... | Line 178... | ||
178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
179 | #endif |
179 | #endif |
180 | return -1; |
180 | return -1; |
181 | } |
181 | } |
182 | 182 | ||
- | 183 | #ifdef CONFIG_UDEBUG |
|
183 | mutex_initialize(&t->udebug.lock, MUTEX_PASSIVE); |
184 | mutex_initialize(&t->udebug.lock, MUTEX_PASSIVE); |
- | 185 | #endif |
|
184 | 186 | ||
185 | return 0; |
187 | return 0; |
186 | } |
188 | } |
187 | 189 | ||
188 | /** Destruction of thread_t object */ |
190 | /** Destruction of thread_t object */ |
Line 346... | Line 348... | ||
346 | t->fpu_context_exists = 0; |
348 | t->fpu_context_exists = 0; |
347 | t->fpu_context_engaged = 0; |
349 | t->fpu_context_engaged = 0; |
348 | 350 | ||
349 | avltree_node_initialize(&t->threads_tree_node); |
351 | avltree_node_initialize(&t->threads_tree_node); |
350 | t->threads_tree_node.key = (uintptr_t) t; |
352 | t->threads_tree_node.key = (uintptr_t) t; |
351 | 353 | ||
- | 354 | #ifdef CONFIG_UDEBUG |
|
352 | /* Init debugging stuff */ |
355 | /* Init debugging stuff */ |
353 | udebug_thread_initialize(&t->udebug); |
356 | udebug_thread_initialize(&t->udebug); |
- | 357 | #endif |
|
354 | 358 | ||
355 | /* might depend on previous initialization */ |
359 | /* might depend on previous initialization */ |
356 | thread_create_arch(t); |
360 | thread_create_arch(t); |
357 | 361 | ||
358 | if (!(flags & THREAD_FLAG_NOATTACH)) |
362 | if (!(flags & THREAD_FLAG_NOATTACH)) |
Line 416... | Line 420... | ||
416 | /* |
420 | /* |
417 | * Attach to the specified task. |
421 | * Attach to the specified task. |
418 | */ |
422 | */ |
419 | ipl = interrupts_disable(); |
423 | ipl = interrupts_disable(); |
420 | spinlock_lock(&task->lock); |
424 | spinlock_lock(&task->lock); |
- | 425 | ||
421 | atomic_inc(&task->refcount); |
426 | atomic_inc(&task->refcount); |
- | 427 | ||
422 | /* Must not count kbox thread into lifecount */ |
428 | /* Must not count kbox thread into lifecount */ |
423 | if (t->flags & THREAD_FLAG_USPACE) |
429 | if (t->flags & THREAD_FLAG_USPACE) |
424 | atomic_inc(&task->lifecount); |
430 | atomic_inc(&task->lifecount); |
- | 431 | ||
425 | list_append(&t->th_link, &task->th_head); |
432 | list_append(&t->th_link, &task->th_head); |
426 | spinlock_unlock(&task->lock); |
433 | spinlock_unlock(&task->lock); |
427 | 434 | ||
428 | /* |
435 | /* |
429 | * Register this thread in the system-wide list. |
436 | * Register this thread in the system-wide list. |
Line 443... | Line 450... | ||
443 | void thread_exit(void) |
450 | void thread_exit(void) |
444 | { |
451 | { |
445 | ipl_t ipl; |
452 | ipl_t ipl; |
446 | 453 | ||
447 | if (THREAD->flags & THREAD_FLAG_USPACE) { |
454 | if (THREAD->flags & THREAD_FLAG_USPACE) { |
- | 455 | #ifdef CONFIG_UDEBUG |
|
448 | /* Generate udebug THREAD_E event */ |
456 | /* Generate udebug THREAD_E event */ |
449 | udebug_thread_e_event(); |
457 | udebug_thread_e_event(); |
450 | 458 | #endif |
|
451 | if (atomic_predec(&TASK->lifecount) == 0) { |
459 | if (atomic_predec(&TASK->lifecount) == 0) { |
452 | /* |
460 | /* |
453 | * We are the last userspace thread in the task that |
461 | * We are the last userspace thread in the task that |
454 | * still has not exited. With the exception of the |
462 | * still has not exited. With the exception of the |
455 | * moment the task was created, new userspace threads |
463 | * moment the task was created, new userspace threads |
Line 750... | Line 758... | ||
750 | } |
758 | } |
751 | } |
759 | } |
752 | thread_attach(t, TASK); |
760 | thread_attach(t, TASK); |
753 | thread_ready(t); |
761 | thread_ready(t); |
754 | 762 | ||
- | 763 | #ifdef CONFIG_UDEBUG |
|
755 | /* Generate udebug THREAD_B event */ |
764 | /* Generate udebug THREAD_B event */ |
756 | udebug_thread_b_event(t); |
765 | udebug_thread_b_event(t); |
- | 766 | #endif |
|
757 | 767 | ||
758 | return 0; |
768 | return 0; |
759 | } else |
769 | } else |
760 | free(kernel_uarg); |
770 | free(kernel_uarg); |
761 | 771 |