Changes in kernel/generic/src/proc/thread.c [22e6802:7ed8530] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/thread.c
r22e6802 r7ed8530 1 1 /* 2 * Copyright (c) 20 01-2004Jakub Jermar2 * Copyright (c) 2010 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 50 50 #include <synch/rwlock.h> 51 51 #include <cpu.h> 52 #include < func.h>52 #include <str.h> 53 53 #include <context.h> 54 54 #include <adt/avl.h> … … 76 76 77 77 /** Thread states */ 78 c har *thread_states[] = {78 const char *thread_states[] = { 79 79 "Invalid", 80 80 "Running", … … 84 84 "Exiting", 85 85 "Lingering" 86 }; 86 }; 87 88 typedef struct { 89 thread_id_t thread_id; 90 thread_t *thread; 91 } thread_iterator_t; 87 92 88 93 /** Lock protecting the threads_tree AVL tree. … … 132 137 spinlock_lock(&THREAD->lock); 133 138 if (!THREAD->uncounted) { 134 thread_update_accounting(); 135 uint64_t cycles = THREAD->cycles; 136 THREAD->cycles = 0; 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 137 145 spinlock_unlock(&THREAD->lock); 138 146 139 147 spinlock_lock(&TASK->lock); 140 TASK->cycles += cycles; 148 TASK->ucycles += ucycles; 149 TASK->kcycles += kcycles; 141 150 spinlock_unlock(&TASK->lock); 142 151 } else … … 264 273 265 274 atomic_inc(&nrdy); 275 // FIXME: Why is the avg value never read? 266 276 avg = atomic_get(&nrdy) / config.cpu_active; 267 277 atomic_inc(&cpu->nrdy); … … 288 298 */ 289 299 thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, 290 int flags, c har *name, bool uncounted)300 int flags, const char *name, bool uncounted) 291 301 { 292 302 thread_t *t; … … 322 332 t->thread_arg = arg; 323 333 t->ticks = -1; 324 t->cycles = 0; 334 t->ucycles = 0; 335 t->kcycles = 0; 325 336 t->uncounted = uncounted; 326 337 t->priority = -1; /* start in rq[0] */ … … 398 409 399 410 /* 400 * t is guaranteed to be the very last thread of its task. 401 * It is safe to destroy the task. 411 * Drop the reference to the containing task. 402 412 */ 403 if (atomic_predec(&t->task->refcount) == 0) 404 task_destroy(t->task); 413 task_release(t->task); 405 414 406 415 slab_free(thread_slab, t); … … 425 434 spinlock_lock(&task->lock); 426 435 427 atomic_inc(&task->refcount); 436 /* Hold a reference to the task. */ 437 task_hold(task); 428 438 429 439 /* Must not count kbox thread into lifecount */ … … 613 623 thread_t *t = avltree_get_instance(node, thread_t, threads_tree_node); 614 624 615 uint64_t cycles; 616 char suffix; 617 order(t->cycles, &cycles, &suffix); 625 uint64_t ucycles, kcycles; 626 char usuffix, ksuffix; 627 order_suffix(t->ucycles, &ucycles, &usuffix); 628 order_suffix(t->kcycles, &kcycles, &ksuffix); 618 629 619 630 #ifdef __32_BITS__ 620 printf("%-6" PRIu64" %-10s %10p %-8s %10p %-3" PRIu32 " %10p %10p %9" PRIu64 "%c ", 621 t->tid, t->name, t, thread_states[t->state], t->task, 622 t->task->context, t->thread_code, t->kstack, cycles, suffix); 631 printf("%-6" PRIu64" %-10s %10p %-8s %10p %-3" PRIu32 " %10p %10p %9" 632 PRIu64 "%c %9" PRIu64 "%c ", t->tid, t->name, t, 633 thread_states[t->state], t->task, t->task->context, t->thread_code, 634 t->kstack, ucycles, usuffix, kcycles, ksuffix); 623 635 #endif 624 636 625 637 #ifdef __64_BITS__ 626 printf("%-6" PRIu64" %-10s %18p %-8s %18p %-3" PRIu32 " %18p %18p %9" PRIu64 "%c ", 627 t->tid, t->name, t, thread_states[t->state], t->task, 628 t->task->context, t->thread_code, t->kstack, cycles, suffix); 638 printf("%-6" PRIu64" %-10s %18p %-8s %18p %-3" PRIu32 " %18p %18p %9" 639 PRIu64 "%c %9" PRIu64 "%c ", t->tid, t->name, t, 640 thread_states[t->state], t->task, t->task->context, t->thread_code, 641 t->kstack, ucycles, usuffix, kcycles, ksuffix); 629 642 #endif 630 643 … … 660 673 #ifdef __32_BITS__ 661 674 printf("tid name address state task " 662 "ctx code stack cyclescpu "675 "ctx code stack ucycles kcycles cpu " 663 676 "waitqueue\n"); 664 677 printf("------ ---------- ---------- -------- ---------- " 665 "--- ---------- ---------- ---------- ---- "678 "--- ---------- ---------- ---------- ---------- ---- " 666 679 "----------\n"); 667 680 #endif … … 669 682 #ifdef __64_BITS__ 670 683 printf("tid name address state task " 671 "ctx code stack cyclescpu "684 "ctx code stack ucycles kcycles cpu " 672 685 "waitqueue\n"); 673 686 printf("------ ---------- ------------------ -------- ------------------ " 674 "--- ------------------ ------------------ ---------- ---- "687 "--- ------------------ ------------------ ---------- ---------- ---- " 675 688 "------------------\n"); 676 689 #endif … … 705 718 * interrupts must be already disabled. 706 719 * 707 */ 708 void thread_update_accounting(void) 720 * @param user True to update user accounting, false for kernel. 721 */ 722 void thread_update_accounting(bool user) 709 723 { 710 724 uint64_t time = get_cycle(); 711 THREAD->cycles += time - THREAD->last_cycle; 725 if (user) { 726 THREAD->ucycles += time - THREAD->last_cycle; 727 } else { 728 THREAD->kcycles += time - THREAD->last_cycle; 729 } 712 730 THREAD->last_cycle = time; 713 731 } 732 733 static bool thread_search_walker(avltree_node_t *node, void *arg) 734 { 735 thread_t *thread = 736 (thread_t *) avltree_get_instance(node, thread_t, threads_tree_node); 737 thread_iterator_t *iterator = (thread_iterator_t *) arg; 738 739 if (thread->tid == iterator->thread_id) { 740 iterator->thread = thread; 741 return false; 742 } 743 744 return true; 745 } 746 747 /** Find thread structure corresponding to thread ID. 748 * 749 * The threads_lock must be already held by the caller of this function and 750 * interrupts must be disabled. 751 * 752 * @param id Thread ID. 753 * 754 * @return Thread structure address or NULL if there is no such thread ID. 755 * 756 */ 757 thread_t *thread_find_by_id(thread_id_t thread_id) 758 { 759 thread_iterator_t iterator; 760 761 iterator.thread_id = thread_id; 762 iterator.thread = NULL; 763 764 avltree_walk(&threads_tree, thread_search_walker, (void *) &iterator); 765 766 return iterator.thread; 767 } 768 714 769 715 770 /** Process syscall to create new thread.
Note:
See TracChangeset
for help on using the changeset viewer.