Rev 2187 | Rev 2229 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2187 | Rev 2216 | ||
|---|---|---|---|
| Line 92... | Line 92... | ||
| 92 | * exist as long as the threads_lock is held. |
92 | * exist as long as the threads_lock is held. |
| 93 | */ |
93 | */ |
| 94 | btree_t threads_btree; |
94 | btree_t threads_btree; |
| 95 | 95 | ||
| 96 | SPINLOCK_INITIALIZE(tidlock); |
96 | SPINLOCK_INITIALIZE(tidlock); |
| 97 | uint32_t last_tid = 0; |
97 | thread_id_t last_tid = 0; |
| 98 | 98 | ||
| 99 | static slab_cache_t *thread_slab; |
99 | static slab_cache_t *thread_slab; |
| 100 | #ifdef ARCH_HAS_FPU |
100 | #ifdef ARCH_HAS_FPU |
| 101 | slab_cache_t *fpu_context_slab; |
101 | slab_cache_t *fpu_context_slab; |
| 102 | #endif |
102 | #endif |
| Line 578... | Line 578... | ||
| 578 | 578 | ||
| 579 | uint64_t cycles; |
579 | uint64_t cycles; |
| 580 | char suffix; |
580 | char suffix; |
| 581 | order(t->cycles, &cycles, &suffix); |
581 | order(t->cycles, &cycles, &suffix); |
| 582 | 582 | ||
| 583 | printf("%-6zd %-10s %#10zx %-8s %#10zx %-3ld %#10zx " |
583 | printf("%-6llu %-10s %#10zx %-8s %#10zx %-3ld %#10zx " |
| 584 | "%#10zx %9llu%c ", t->tid, t->name, t, |
584 | "%#10zx %9llu%c ", t->tid, t->name, t, |
| 585 | thread_states[t->state], t->task, t->task->context, |
585 | thread_states[t->state], t->task, t->task->context, |
| 586 | t->thread_code, t->kstack, cycles, suffix); |
586 | t->thread_code, t->kstack, cycles, suffix); |
| 587 | 587 | ||
| 588 | if (t->cpu) |
588 | if (t->cpu) |
| Line 634... | Line 634... | ||
| 634 | } |
634 | } |
| 635 | 635 | ||
| 636 | /** Process syscall to create new thread. |
636 | /** Process syscall to create new thread. |
| 637 | * |
637 | * |
| 638 | */ |
638 | */ |
| 639 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name) |
639 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, thread_id_t *uspace_thread_id) |
| 640 | { |
640 | { |
| 641 | thread_t *t; |
641 | thread_t *t; |
| 642 | char namebuf[THREAD_NAME_BUFLEN]; |
642 | char namebuf[THREAD_NAME_BUFLEN]; |
| 643 | uspace_arg_t *kernel_uarg; |
643 | uspace_arg_t *kernel_uarg; |
| 644 | uint32_t tid; |
- | |
| 645 | int rc; |
644 | int rc; |
| 646 | 645 | ||
| 647 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
646 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
| 648 | if (rc != 0) |
647 | if (rc != 0) |
| 649 | return (unative_t) rc; |
648 | return (unative_t) rc; |
| Line 656... | Line 655... | ||
| 656 | } |
655 | } |
| 657 | 656 | ||
| 658 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
657 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
| 659 | false); |
658 | false); |
| 660 | if (t) { |
659 | if (t) { |
| 661 | tid = t->tid; |
- | |
| 662 | thread_ready(t); |
660 | thread_ready(t); |
| - | 661 | if (uspace_thread_id != NULL) |
|
| - | 662 | return (unative_t) copy_to_uspace(uspace_thread_id, &t->tid, |
|
| 663 | return (unative_t) tid; |
663 | sizeof(t->tid)); |
| - | 664 | else |
|
| - | 665 | return 0; |
|
| 664 | } else { |
666 | } else |
| 665 | free(kernel_uarg); |
667 | free(kernel_uarg); |
| 666 | } |
- | |
| 667 | 668 | ||
| 668 | return (unative_t) ENOMEM; |
669 | return (unative_t) ENOMEM; |
| 669 | } |
670 | } |
| 670 | 671 | ||
| 671 | /** Process syscall to terminate thread. |
672 | /** Process syscall to terminate thread. |
| Line 678... | Line 679... | ||
| 678 | return 0; |
679 | return 0; |
| 679 | } |
680 | } |
| 680 | 681 | ||
| 681 | /** Syscall for getting TID. |
682 | /** Syscall for getting TID. |
| 682 | * |
683 | * |
| - | 684 | * @param uspace_thread_id Userspace address of 8-byte buffer where to store |
|
| 683 | * @return Thread ID. |
685 | * current thread ID. |
| - | 686 | * |
|
| - | 687 | * @return 0 on success or an error code from @ref errno.h. |
|
| 684 | */ |
688 | */ |
| 685 | unative_t sys_thread_get_id(void) |
689 | unative_t sys_thread_get_id(thread_id_t *uspace_thread_id) |
| 686 | { |
690 | { |
| 687 | /* |
691 | /* |
| 688 | * No need to acquire lock on THREAD because tid |
692 | * No need to acquire lock on THREAD because tid |
| 689 | * remains constant for the lifespan of the thread. |
693 | * remains constant for the lifespan of the thread. |
| 690 | */ |
694 | */ |
| - | 695 | return (unative_t) copy_to_uspace(uspace_thread_id, &THREAD->tid, |
|
| 691 | return THREAD->tid; |
696 | sizeof(THREAD->tid)); |
| 692 | } |
697 | } |
| 693 | 698 | ||
| 694 | /** @} |
699 | /** @} |
| 695 | */ |
700 | */ |