Rev 2787 | Rev 2801 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2787 | Rev 2799 | ||
|---|---|---|---|
| Line 66... | Line 66... | ||
| 66 | #include <debug.h> |
66 | #include <debug.h> |
| 67 | #include <main/uinit.h> |
67 | #include <main/uinit.h> |
| 68 | #include <syscall/copy.h> |
68 | #include <syscall/copy.h> |
| 69 | #include <errno.h> |
69 | #include <errno.h> |
| 70 | #include <console/klog.h> |
70 | #include <console/klog.h> |
| 71 | #include <tdebug/tdebug.h> |
- | |
| 72 | 71 | ||
| 73 | 72 | ||
| 74 | /** Thread states */ |
73 | /** Thread states */ |
| 75 | char *thread_states[] = { |
74 | char *thread_states[] = { |
| 76 | "Invalid", |
75 | "Invalid", |
| Line 340... | Line 339... | ||
| 340 | t->fpu_context_exists = 0; |
339 | t->fpu_context_exists = 0; |
| 341 | t->fpu_context_engaged = 0; |
340 | t->fpu_context_engaged = 0; |
| 342 | 341 | ||
| 343 | avltree_node_initialize(&t->threads_tree_node); |
342 | avltree_node_initialize(&t->threads_tree_node); |
| 344 | t->threads_tree_node.key = (uintptr_t) t; |
343 | t->threads_tree_node.key = (uintptr_t) t; |
| 345 | // t->threads_tree_node.key = (avltree_key_t) t->tid; |
- | |
| 346 | 344 | ||
| 347 | /* might depend on previous initialization */ |
345 | /* might depend on previous initialization */ |
| 348 | thread_create_arch(t); |
346 | thread_create_arch(t); |
| 349 | - | ||
| 350 | /* init tdebug stuff */ |
- | |
| 351 | tdebug_thread_init(t); |
- | |
| 352 | 347 | ||
| 353 | if (!(flags & THREAD_FLAG_NOATTACH)) |
348 | if (!(flags & THREAD_FLAG_NOATTACH)) |
| 354 | thread_attach(t, task); |
349 | thread_attach(t, task); |
| 355 | 350 | ||
| 356 | return t; |
351 | return t; |
| Line 445... | Line 440... | ||
| 445 | * We are safe to perform cleanup. |
440 | * We are safe to perform cleanup. |
| 446 | */ |
441 | */ |
| 447 | if (THREAD->flags & THREAD_FLAG_USPACE) { |
442 | if (THREAD->flags & THREAD_FLAG_USPACE) { |
| 448 | ipc_cleanup(); |
443 | ipc_cleanup(); |
| 449 | futex_cleanup(); |
444 | futex_cleanup(); |
| 450 | tdebug_cleanup(); |
- | |
| 451 | klog_printf("Cleanup of task %llu completed.", |
445 | klog_printf("Cleanup of task %llu completed.", |
| 452 | TASK->taskid); |
446 | TASK->taskid); |
| 453 | } |
447 | } |
| 454 | } |
448 | } |
| 455 | 449 | ||
| Line 753... | Line 747... | ||
| 753 | thread_exit(); |
747 | thread_exit(); |
| 754 | /* Unreachable */ |
748 | /* Unreachable */ |
| 755 | return 0; |
749 | return 0; |
| 756 | } |
750 | } |
| 757 | 751 | ||
| 758 | struct fbiw { |
- | |
| 759 | thread_id_t tid; |
- | |
| 760 | thread_t *t; |
- | |
| 761 | }; |
- | |
| 762 | - | ||
| 763 | static bool find_by_id_walker(avltree_node_t *node, void *arg) |
- | |
| 764 | { |
- | |
| 765 | thread_t *t = avltree_get_instance(node, thread_t, threads_tree_node); |
- | |
| 766 | struct fbiw *s = (struct fbiw *)arg; |
- | |
| 767 | - | ||
| 768 | if (t->tid == s->tid) { |
- | |
| 769 | /* found it! */ |
- | |
| 770 | s->t = t; |
- | |
| 771 | return false; |
- | |
| 772 | } |
- | |
| 773 | - | ||
| 774 | return true; /* continue */ |
- | |
| 775 | } |
- | |
| 776 | - | ||
| 777 | /** Find thread structure corresponding to thread ID. |
- | |
| 778 | * |
- | |
| 779 | * The threads_lock must be already held by the caller of this function |
- | |
| 780 | * and interrupts must be disabled. |
- | |
| 781 | * |
- | |
| 782 | * @param id Thread ID. |
- | |
| 783 | * |
- | |
| 784 | * @return Thread structure address or NULL if there is no such thread ID. |
- | |
| 785 | */ |
- | |
| 786 | thread_t *thread_find_by_id(thread_id_t id) |
- | |
| 787 | { |
- | |
| 788 | struct fbiw s; |
- | |
| 789 | - | ||
| 790 | s.t = NULL; |
- | |
| 791 | s.tid = id; |
- | |
| 792 | - | ||
| 793 | avltree_walk(&threads_tree, find_by_id_walker, &s); |
- | |
| 794 | - | ||
| 795 | return s.t; |
- | |
| 796 | /* |
- | |
| 797 | // ANO, takhle krasne by to fungovalo, kdyby threads_tree |
- | |
| 798 | // nepouzival jako klic pointer na vlakno misto tid |
- | |
| 799 | avltree_node_t *node; |
- | |
| 800 | |
- | |
| 801 | node = avltree_search(&threads_tree, (avltree_key_t) id); |
- | |
| 802 | - | ||
| 803 | if (node) |
- | |
| 804 | return avltree_get_instance(node, thread_t, threads_tree_node); |
- | |
| 805 | return NULL;*/ |
- | |
| 806 | } |
- | |
| 807 | - | ||
| 808 | /** Syscall for getting TID. |
752 | /** Syscall for getting TID. |
| 809 | * |
753 | * |
| 810 | * @param uspace_thread_id Userspace address of 8-byte buffer where to store |
754 | * @param uspace_thread_id Userspace address of 8-byte buffer where to store |
| 811 | * current thread ID. |
755 | * current thread ID. |
| 812 | * |
756 | * |