Rev 2292 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2292 | Rev 2307 | ||
|---|---|---|---|
| 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 236... | Line 236... | ||
| 236 | 236 | ||
| 237 | i = (t->priority < RQ_COUNT - 1) ? ++t->priority : t->priority; |
237 | i = (t->priority < RQ_COUNT - 1) ? ++t->priority : t->priority; |
| 238 | 238 | ||
| 239 | cpu = CPU; |
239 | cpu = CPU; |
| 240 | if (t->flags & THREAD_FLAG_WIRED) { |
240 | if (t->flags & THREAD_FLAG_WIRED) { |
| - | 241 | ASSERT(t->cpu != NULL); |
|
| 241 | cpu = t->cpu; |
242 | cpu = t->cpu; |
| 242 | } |
243 | } |
| 243 | t->state = Ready; |
244 | t->state = Ready; |
| 244 | spinlock_unlock(&t->lock); |
245 | spinlock_unlock(&t->lock); |
| 245 | 246 | ||
| Line 494... | Line 495... | ||
| 494 | void thread_detach(thread_t *t) |
495 | void thread_detach(thread_t *t) |
| 495 | { |
496 | { |
| 496 | ipl_t ipl; |
497 | ipl_t ipl; |
| 497 | 498 | ||
| 498 | /* |
499 | /* |
| 499 | * Since the thread is expected to not be already detached, |
500 | * Since the thread is expected not to be already detached, |
| 500 | * pointer to it must be still valid. |
501 | * pointer to it must be still valid. |
| 501 | */ |
502 | */ |
| 502 | ipl = interrupts_disable(); |
503 | ipl = interrupts_disable(); |
| 503 | spinlock_lock(&t->lock); |
504 | spinlock_lock(&t->lock); |
| 504 | ASSERT(!t->detached); |
505 | ASSERT(!t->detached); |
| Line 578... | Line 579... | ||
| 578 | 579 | ||
| 579 | uint64_t cycles; |
580 | uint64_t cycles; |
| 580 | char suffix; |
581 | char suffix; |
| 581 | order(t->cycles, &cycles, &suffix); |
582 | order(t->cycles, &cycles, &suffix); |
| 582 | 583 | ||
| 583 | printf("%-6zd %-10s %#10zx %-8s %#10zx %-3ld %#10zx " |
584 | printf("%-6llu %-10s %#10zx %-8s %#10zx %-3ld %#10zx " |
| 584 | "%#10zx %9llu%c ", t->tid, t->name, t, |
585 | "%#10zx %9llu%c ", t->tid, t->name, t, |
| 585 | thread_states[t->state], t->task, t->task->context, |
586 | thread_states[t->state], t->task, t->task->context, |
| 586 | t->thread_code, t->kstack, cycles, suffix); |
587 | t->thread_code, t->kstack, cycles, suffix); |
| 587 | 588 | ||
| 588 | if (t->cpu) |
589 | if (t->cpu) |
| Line 634... | Line 635... | ||
| 634 | } |
635 | } |
| 635 | 636 | ||
| 636 | /** Process syscall to create new thread. |
637 | /** Process syscall to create new thread. |
| 637 | * |
638 | * |
| 638 | */ |
639 | */ |
| 639 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name) |
640 | unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, thread_id_t *uspace_thread_id) |
| 640 | { |
641 | { |
| 641 | thread_t *t; |
642 | thread_t *t; |
| 642 | char namebuf[THREAD_NAME_BUFLEN]; |
643 | char namebuf[THREAD_NAME_BUFLEN]; |
| 643 | uspace_arg_t *kernel_uarg; |
644 | uspace_arg_t *kernel_uarg; |
| 644 | uint32_t tid; |
- | |
| 645 | int rc; |
645 | int rc; |
| 646 | 646 | ||
| 647 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
647 | rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
| 648 | if (rc != 0) |
648 | if (rc != 0) |
| 649 | return (unative_t) rc; |
649 | return (unative_t) rc; |
| Line 656... | Line 656... | ||
| 656 | } |
656 | } |
| 657 | 657 | ||
| 658 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
658 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
| 659 | false); |
659 | false); |
| 660 | if (t) { |
660 | if (t) { |
| 661 | tid = t->tid; |
- | |
| 662 | thread_ready(t); |
661 | thread_ready(t); |
| - | 662 | if (uspace_thread_id != NULL) |
|
| - | 663 | return (unative_t) copy_to_uspace(uspace_thread_id, &t->tid, |
|
| 663 | return (unative_t) tid; |
664 | sizeof(t->tid)); |
| - | 665 | else |
|
| - | 666 | return 0; |
|
| 664 | } else { |
667 | } else |
| 665 | free(kernel_uarg); |
668 | free(kernel_uarg); |
| 666 | } |
- | |
| 667 | 669 | ||
| 668 | return (unative_t) ENOMEM; |
670 | return (unative_t) ENOMEM; |
| 669 | } |
671 | } |
| 670 | 672 | ||
| 671 | /** Process syscall to terminate thread. |
673 | /** Process syscall to terminate thread. |
| Line 676... | Line 678... | ||
| 676 | thread_exit(); |
678 | thread_exit(); |
| 677 | /* Unreachable */ |
679 | /* Unreachable */ |
| 678 | return 0; |
680 | return 0; |
| 679 | } |
681 | } |
| 680 | 682 | ||
| - | 683 | /** Syscall for getting TID. |
|
| - | 684 | * |
|
| - | 685 | * @param uspace_thread_id Userspace address of 8-byte buffer where to store |
|
| - | 686 | * current thread ID. |
|
| 681 | /** @} |
687 | * |
| - | 688 | * @return 0 on success or an error code from @ref errno.h. |
|
| 682 | */ |
689 | */ |
| - | 690 | unative_t sys_thread_get_id(thread_id_t *uspace_thread_id) |
|
| - | 691 | { |
|
| - | 692 | /* |
|
| - | 693 | * No need to acquire lock on THREAD because tid |
|
| - | 694 | * remains constant for the lifespan of the thread. |
|
| - | 695 | */ |
|
| - | 696 | return (unative_t) copy_to_uspace(uspace_thread_id, &THREAD->tid, |
|
| - | 697 | sizeof(THREAD->tid)); |
|
| - | 698 | } |
|
| 683 | 699 | ||
| - | 700 | /** @} |
|
| - | 701 | */ |
|