Rev 2039 | Rev 2050 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2039 | Rev 2042 | ||
---|---|---|---|
Line 121... | Line 121... | ||
121 | 121 | ||
122 | /* Accumulate accounting to the task */ |
122 | /* Accumulate accounting to the task */ |
123 | ipl_t ipl = interrupts_disable(); |
123 | ipl_t ipl = interrupts_disable(); |
124 | 124 | ||
125 | spinlock_lock(&THREAD->lock); |
125 | spinlock_lock(&THREAD->lock); |
- | 126 | if (!THREAD->uncounted) { |
|
126 | thread_update_accounting(); |
127 | thread_update_accounting(); |
127 | uint64_t cycles = THREAD->cycles; |
128 | uint64_t cycles = THREAD->cycles; |
128 | THREAD->cycles = 0; |
129 | THREAD->cycles = 0; |
129 | spinlock_unlock(&THREAD->lock); |
130 | spinlock_unlock(&THREAD->lock); |
130 | 131 | ||
131 | spinlock_lock(&TASK->lock); |
132 | spinlock_lock(&TASK->lock); |
132 | TASK->cycles += cycles; |
133 | TASK->cycles += cycles; |
133 | spinlock_unlock(&TASK->lock); |
134 | spinlock_unlock(&TASK->lock); |
- | 135 | } else |
|
- | 136 | spinlock_unlock(&THREAD->lock); |
|
134 | 137 | ||
135 | interrupts_restore(ipl); |
138 | interrupts_restore(ipl); |
136 | 139 | ||
137 | thread_exit(); |
140 | thread_exit(); |
138 | /* not reached */ |
141 | /* not reached */ |
Line 300... | Line 303... | ||
300 | 303 | ||
301 | /** Create new thread |
304 | /** Create new thread |
302 | * |
305 | * |
303 | * Create a new thread. |
306 | * Create a new thread. |
304 | * |
307 | * |
305 | * @param func Thread's implementing function. |
308 | * @param func Thread's implementing function. |
306 | * @param arg Thread's implementing function argument. |
309 | * @param arg Thread's implementing function argument. |
307 | * @param task Task to which the thread belongs. |
310 | * @param task Task to which the thread belongs. |
308 | * @param flags Thread flags. |
311 | * @param flags Thread flags. |
309 | * @param name Symbolic name. |
312 | * @param name Symbolic name. |
- | 313 | * @param uncounted Thread's accounting doesn't affect accumulated task accounting. |
|
310 | * |
314 | * |
311 | * @return New thread's structure on success, NULL on failure. |
315 | * @return New thread's structure on success, NULL on failure. |
312 | * |
316 | * |
313 | */ |
317 | */ |
314 | thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags, char *name) |
318 | thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags, char *name, bool uncounted) |
315 | { |
319 | { |
316 | thread_t *t; |
320 | thread_t *t; |
317 | ipl_t ipl; |
321 | ipl_t ipl; |
318 | 322 | ||
319 | t = (thread_t *) slab_alloc(thread_slab, 0); |
323 | t = (thread_t *) slab_alloc(thread_slab, 0); |
Line 342... | Line 346... | ||
342 | 346 | ||
343 | t->thread_code = func; |
347 | t->thread_code = func; |
344 | t->thread_arg = arg; |
348 | t->thread_arg = arg; |
345 | t->ticks = -1; |
349 | t->ticks = -1; |
346 | t->cycles = 0; |
350 | t->cycles = 0; |
- | 351 | t->uncounted = uncounted; |
|
347 | t->priority = -1; /* start in rq[0] */ |
352 | t->priority = -1; /* start in rq[0] */ |
348 | t->cpu = NULL; |
353 | t->cpu = NULL; |
349 | t->flags = flags; |
354 | t->flags = flags; |
350 | t->state = Entering; |
355 | t->state = Entering; |
351 | t->call_me = NULL; |
356 | t->call_me = NULL; |
Line 647... | Line 652... | ||
647 | if (rc != 0) { |
652 | if (rc != 0) { |
648 | free(kernel_uarg); |
653 | free(kernel_uarg); |
649 | return (unative_t) rc; |
654 | return (unative_t) rc; |
650 | } |
655 | } |
651 | 656 | ||
652 | if ((t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf))) { |
657 | if ((t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, false))) { |
653 | tid = t->tid; |
658 | tid = t->tid; |
654 | thread_ready(t); |
659 | thread_ready(t); |
655 | return (unative_t) tid; |
660 | return (unative_t) tid; |
656 | } else { |
661 | } else { |
657 | free(kernel_uarg); |
662 | free(kernel_uarg); |