Rev 3426 | Rev 3597 | 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 | ||