Changeset 52755f1 in mainline for kernel/generic/src/proc/thread.c
- Timestamp:
- 2008-06-03T14:53:31Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- aa48a9d
- Parents:
- 5b86d10
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
r5b86d10 r52755f1 68 68 #include <syscall/copy.h> 69 69 #include <errno.h> 70 #include <console/klog.h> 70 71 72 #ifndef LOADED_PROG_STACK_PAGES_NO 73 #define LOADED_PROG_STACK_PAGES_NO 1 74 #endif 71 75 72 76 … … 444 448 if (THREAD->flags & THREAD_FLAG_USPACE) { 445 449 ipc_cleanup(); 446 futex_cleanup(); 447 klog_printf("Cleanup of task %llu completed.", 448 TASK->taskid); 450 futex_cleanup(); 451 LOG("Cleanup of task %" PRIu64" completed.", TASK->taskid); 449 452 } 450 453 } … … 582 585 static bool thread_walker(avltree_node_t *node, void *arg) 583 586 { 584 thread_t *t; 585 586 t = avltree_get_instance(node, thread_t, threads_tree_node); 587 587 thread_t *t = avltree_get_instance(node, thread_t, threads_tree_node); 588 588 589 uint64_t cycles; 589 590 char suffix; 590 591 order(t->cycles, &cycles, &suffix); 591 592 if (sizeof(void *) == 4) 593 printf("%-6llu %-10s %#10zx %-8s %#10zx %-3ld %#10zx %#10zx %9llu%c ", 594 t->tid, t->name, t, thread_states[t->state], t->task, 595 t->task->context, t->thread_code, t->kstack, cycles, suffix); 596 else 597 printf("%-6llu %-10s %#18zx %-8s %#18zx %-3ld %#18zx %#18zx %9llu%c ", 598 t->tid, t->name, t, thread_states[t->state], t->task, 599 t->task->context, t->thread_code, t->kstack, cycles, suffix); 592 593 #ifdef __32_BITS__ 594 printf("%-6" PRIu64" %-10s %10p %-8s %10p %-3" PRIu32 " %10p %10p %9" PRIu64 "%c ", 595 t->tid, t->name, t, thread_states[t->state], t->task, 596 t->task->context, t->thread_code, t->kstack, cycles, suffix); 597 #endif 598 599 #ifdef __64_BITS__ 600 printf("%-6" PRIu64" %-10s %18p %-8s %18p %-3" PRIu32 " %18p %18p %9" PRIu64 "%c ", 601 t->tid, t->name, t, thread_states[t->state], t->task, 602 t->task->context, t->thread_code, t->kstack, cycles, suffix); 603 #endif 600 604 601 605 if (t->cpu) 602 printf("%-4 zd", t->cpu->id);606 printf("%-4u", t->cpu->id); 603 607 else 604 608 printf("none"); 605 609 606 610 if (t->state == Sleeping) { 607 if (sizeof(uintptr_t) == 4) 608 printf(" %#10zx", t->sleep_queue); 609 else 610 printf(" %#18zx", t->sleep_queue); 611 #ifdef __32_BITS__ 612 printf(" %10p", t->sleep_queue); 613 #endif 614 615 #ifdef __64_BITS__ 616 printf(" %18p", t->sleep_queue); 617 #endif 611 618 } 612 619 … … 624 631 ipl = interrupts_disable(); 625 632 spinlock_lock(&threads_lock); 626 627 if (sizeof(uintptr_t) == 4) { 628 printf("tid name address state task " 629 "ctx code stack cycles cpu " 630 "waitqueue\n"); 631 printf("------ ---------- ---------- -------- ---------- " 632 "--- ---------- ---------- ---------- ---- " 633 "----------\n"); 634 } else { 635 printf("tid name address state task " 636 "ctx code stack cycles cpu " 637 "waitqueue\n"); 638 printf("------ ---------- ------------------ -------- ------------------ " 639 "--- ------------------ ------------------ ---------- ---- " 640 "------------------\n"); 641 } 633 634 #ifdef __32_BITS__ 635 printf("tid name address state task " 636 "ctx code stack cycles cpu " 637 "waitqueue\n"); 638 printf("------ ---------- ---------- -------- ---------- " 639 "--- ---------- ---------- ---------- ---- " 640 "----------\n"); 641 #endif 642 643 #ifdef __64_BITS__ 644 printf("tid name address state task " 645 "ctx code stack cycles cpu " 646 "waitqueue\n"); 647 printf("------ ---------- ------------------ -------- ------------------ " 648 "--- ------------------ ------------------ ---------- ---- " 649 "------------------\n"); 650 #endif 642 651 643 652 avltree_walk(&threads_tree, thread_walker, NULL); … … 663 672 664 673 return node != NULL; 674 } 675 676 677 /** Create new user task with 1 thread from image 678 * 679 * @param program_addr Address of program executable image. 680 * @param name Program name. 681 * 682 * @return Initialized main thread of the task or NULL on error. 683 */ 684 thread_t *thread_create_program(void *program_addr, char *name) 685 { 686 as_t *as; 687 as_area_t *area; 688 unsigned int rc; 689 task_t *task; 690 uspace_arg_t *kernel_uarg; 691 692 kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); 693 if (kernel_uarg == NULL) 694 return NULL; 695 696 kernel_uarg->uspace_entry = 697 (void *) ((elf_header_t *) program_addr)->e_entry; 698 kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS; 699 kernel_uarg->uspace_thread_function = NULL; 700 kernel_uarg->uspace_thread_arg = NULL; 701 kernel_uarg->uspace_uarg = NULL; 702 703 as = as_create(0); 704 if (as == NULL) { 705 free(kernel_uarg); 706 return NULL; 707 } 708 709 rc = elf_load((elf_header_t *) program_addr, as); 710 if (rc != EE_OK) { 711 free(kernel_uarg); 712 as_destroy(as); 713 return NULL; 714 } 715 716 /* 717 * Create the data as_area. 718 */ 719 area = as_area_create(as, 720 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 721 LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS, 722 AS_AREA_ATTR_NONE, &anon_backend, NULL); 723 if (area == NULL) { 724 free(kernel_uarg); 725 as_destroy(as); 726 return NULL; 727 } 728 729 task = task_create(as, name); 730 if (task == NULL) { 731 free(kernel_uarg); 732 as_destroy(as); 733 return NULL; 734 } 735 736 /* 737 * Create the main thread. 738 */ 739 return thread_create(uinit, kernel_uarg, task, THREAD_FLAG_USPACE, 740 "uinit", false); 665 741 } 666 742
Note:
See TracChangeset
for help on using the changeset viewer.