Rev 2032 | Rev 2042 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2032 | Rev 2039 | ||
|---|---|---|---|
| Line 111... | Line 111... | ||
| 111 | { |
111 | { |
| 112 | void (*f)(void *) = THREAD->thread_code; |
112 | void (*f)(void *) = THREAD->thread_code; |
| 113 | void *arg = THREAD->thread_arg; |
113 | void *arg = THREAD->thread_arg; |
| 114 | THREAD->last_cycle = get_cycle(); |
114 | THREAD->last_cycle = get_cycle(); |
| 115 | 115 | ||
| 116 | /* this is where each thread wakes up after its creation */ |
116 | /* This is where each thread wakes up after its creation */ |
| 117 | spinlock_unlock(&THREAD->lock); |
117 | spinlock_unlock(&THREAD->lock); |
| 118 | interrupts_enable(); |
118 | interrupts_enable(); |
| 119 | 119 | ||
| 120 | f(arg); |
120 | f(arg); |
| - | 121 | ||
| - | 122 | /* Accumulate accounting to the task */ |
|
| - | 123 | ipl_t ipl = interrupts_disable(); |
|
| - | 124 | ||
| - | 125 | spinlock_lock(&THREAD->lock); |
|
| - | 126 | thread_update_accounting(); |
|
| - | 127 | uint64_t cycles = THREAD->cycles; |
|
| - | 128 | THREAD->cycles = 0; |
|
| - | 129 | spinlock_unlock(&THREAD->lock); |
|
| - | 130 | ||
| - | 131 | spinlock_lock(&TASK->lock); |
|
| - | 132 | TASK->cycles += cycles; |
|
| - | 133 | spinlock_unlock(&TASK->lock); |
|
| - | 134 | ||
| - | 135 | interrupts_restore(ipl); |
|
| - | 136 | ||
| 121 | thread_exit(); |
137 | thread_exit(); |
| 122 | /* not reached */ |
138 | /* not reached */ |
| 123 | } |
139 | } |
| 124 | 140 | ||
| 125 | /** Initialization and allocation for thread_t structure */ |
141 | /** Initialization and allocation for thread_t structure */ |
| Line 531... | Line 547... | ||
| 531 | 547 | ||
| 532 | /* Messing with thread structures, avoid deadlock */ |
548 | /* Messing with thread structures, avoid deadlock */ |
| 533 | ipl = interrupts_disable(); |
549 | ipl = interrupts_disable(); |
| 534 | spinlock_lock(&threads_lock); |
550 | spinlock_lock(&threads_lock); |
| 535 | 551 | ||
| 536 | printf("tid name address state task ctx code stack cycles cpu kst wq\n"); |
552 | printf("tid name address state task ctx code stack cycles cpu kstack waitqueue\n"); |
| 537 | printf("------ ---------- ---------- -------- ---------- --- ---------- ---------- ---------- ---- ---------- ----------\n"); |
553 | printf("------ ---------- ---------- -------- ---------- --- ---------- ---------- ---------- ---- ---------- ----------\n"); |
| 538 | 554 | ||
| 539 | for (cur = threads_btree.leaf_head.next; cur != &threads_btree.leaf_head; cur = cur->next) { |
555 | for (cur = threads_btree.leaf_head.next; cur != &threads_btree.leaf_head; cur = cur->next) { |
| 540 | btree_node_t *node; |
556 | btree_node_t *node; |
| 541 | int i; |
557 | int i; |
| Line 601... | Line 617... | ||
| 601 | /** Update accounting of current thread. |
617 | /** Update accounting of current thread. |
| 602 | * |
618 | * |
| 603 | * Note that thread_lock on THREAD must be already held and |
619 | * Note that thread_lock on THREAD must be already held and |
| 604 | * interrupts must be already disabled. |
620 | * interrupts must be already disabled. |
| 605 | * |
621 | * |
| 606 | * @param t Pointer to thread. |
- | |
| 607 | * |
- | |
| 608 | */ |
622 | */ |
| 609 | void thread_update_accounting(void) |
623 | void thread_update_accounting(void) |
| 610 | { |
624 | { |
| 611 | uint64_t time = get_cycle(); |
625 | uint64_t time = get_cycle(); |
| 612 | THREAD->cycles += time - THREAD->last_cycle; |
626 | THREAD->cycles += time - THREAD->last_cycle; |