Changes in kernel/generic/src/proc/thread.c [e535eeb:137691a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
re535eeb r137691a 50 50 #include <synch/rwlock.h> 51 51 #include <cpu.h> 52 #include < str.h>52 #include <func.h> 53 53 #include <context.h> 54 54 #include <adt/avl.h> … … 84 84 "Exiting", 85 85 "Lingering" 86 }; 87 88 typedef struct { 89 thread_id_t thread_id; 90 thread_t *thread; 91 } thread_iterator_t; 86 }; 92 87 93 88 /** Lock protecting the threads_tree AVL tree. … … 137 132 spinlock_lock(&THREAD->lock); 138 133 if (!THREAD->uncounted) { 139 thread_update_accounting(true); 140 uint64_t ucycles = THREAD->ucycles; 141 THREAD->ucycles = 0; 142 uint64_t kcycles = THREAD->kcycles; 143 THREAD->kcycles = 0; 144 134 thread_update_accounting(); 135 uint64_t cycles = THREAD->cycles; 136 THREAD->cycles = 0; 145 137 spinlock_unlock(&THREAD->lock); 146 138 147 139 spinlock_lock(&TASK->lock); 148 TASK->ucycles += ucycles; 149 TASK->kcycles += kcycles; 140 TASK->cycles += cycles; 150 141 spinlock_unlock(&TASK->lock); 151 142 } else … … 332 323 t->thread_arg = arg; 333 324 t->ticks = -1; 334 t->ucycles = 0; 335 t->kcycles = 0; 325 t->cycles = 0; 336 326 t->uncounted = uncounted; 337 327 t->priority = -1; /* start in rq[0] */ … … 624 614 thread_t *t = avltree_get_instance(node, thread_t, threads_tree_node); 625 615 626 uint64_t ucycles, kcycles; 627 char usuffix, ksuffix; 628 order_suffix(t->ucycles, &ucycles, &usuffix); 629 order_suffix(t->kcycles, &kcycles, &ksuffix); 616 uint64_t cycles; 617 char suffix; 618 order(t->cycles, &cycles, &suffix); 630 619 631 620 #ifdef __32_BITS__ 632 printf("%-6" PRIu64" %-10s %10p %-8s %10p %-3" PRIu32 " %10p %10p %9" 633 PRIu64 "%c %9" PRIu64 "%c ", t->tid, t->name, t, 634 thread_states[t->state], t->task, t->task->context, t->thread_code, 635 t->kstack, ucycles, usuffix, kcycles, ksuffix); 621 printf("%-6" PRIu64" %-10s %10p %-8s %10p %-3" PRIu32 " %10p %10p %9" PRIu64 "%c ", 622 t->tid, t->name, t, thread_states[t->state], t->task, 623 t->task->context, t->thread_code, t->kstack, cycles, suffix); 636 624 #endif 637 625 638 626 #ifdef __64_BITS__ 639 printf("%-6" PRIu64" %-10s %18p %-8s %18p %-3" PRIu32 " %18p %18p %9" 640 PRIu64 "%c %9" PRIu64 "%c ", t->tid, t->name, t, 641 thread_states[t->state], t->task, t->task->context, t->thread_code, 642 t->kstack, ucycles, usuffix, kcycles, ksuffix); 627 printf("%-6" PRIu64" %-10s %18p %-8s %18p %-3" PRIu32 " %18p %18p %9" PRIu64 "%c ", 628 t->tid, t->name, t, thread_states[t->state], t->task, 629 t->task->context, t->thread_code, t->kstack, cycles, suffix); 643 630 #endif 644 631 … … 674 661 #ifdef __32_BITS__ 675 662 printf("tid name address state task " 676 "ctx code stack ucycles kcyclescpu "663 "ctx code stack cycles cpu " 677 664 "waitqueue\n"); 678 665 printf("------ ---------- ---------- -------- ---------- " 679 "--- ---------- ---------- ---------- ---- ------ ----"666 "--- ---------- ---------- ---------- ---- " 680 667 "----------\n"); 681 668 #endif … … 683 670 #ifdef __64_BITS__ 684 671 printf("tid name address state task " 685 "ctx code stack ucycles kcyclescpu "672 "ctx code stack cycles cpu " 686 673 "waitqueue\n"); 687 674 printf("------ ---------- ------------------ -------- ------------------ " 688 "--- ------------------ ------------------ ---------- ---- ------ ----"675 "--- ------------------ ------------------ ---------- ---- " 689 676 "------------------\n"); 690 677 #endif … … 719 706 * interrupts must be already disabled. 720 707 * 721 * @param user True to update user accounting, false for kernel. 722 */ 723 void thread_update_accounting(bool user) 708 */ 709 void thread_update_accounting(void) 724 710 { 725 711 uint64_t time = get_cycle(); 726 if (user) { 727 THREAD->ucycles += time - THREAD->last_cycle; 728 } else { 729 THREAD->kcycles += time - THREAD->last_cycle; 730 } 712 THREAD->cycles += time - THREAD->last_cycle; 731 713 THREAD->last_cycle = time; 732 714 } 733 734 static bool thread_search_walker(avltree_node_t *node, void *arg)735 {736 thread_t *thread =737 (thread_t *) avltree_get_instance(node, thread_t, threads_tree_node);738 thread_iterator_t *iterator = (thread_iterator_t *) arg;739 740 if (thread->tid == iterator->thread_id) {741 iterator->thread = thread;742 return false;743 }744 745 return true;746 }747 748 /** Find thread structure corresponding to thread ID.749 *750 * The threads_lock must be already held by the caller of this function and751 * interrupts must be disabled.752 *753 * @param id Thread ID.754 *755 * @return Thread structure address or NULL if there is no such thread ID.756 *757 */758 thread_t *thread_find_by_id(thread_id_t thread_id)759 {760 thread_iterator_t iterator;761 762 iterator.thread_id = thread_id;763 iterator.thread = NULL;764 765 avltree_walk(&threads_tree, thread_search_walker, (void *) &iterator);766 767 return iterator.thread;768 }769 770 715 771 716 /** Process syscall to create new thread.
Note:
See TracChangeset
for help on using the changeset viewer.