Subversion Repositories HelenOS

Rev

Rev 2035 | Rev 2040 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2035 Rev 2039
Line 117... Line 117...
117
    ta->refcount = 0;
117
    ta->refcount = 0;
118
    ta->context = CONTEXT;
118
    ta->context = CONTEXT;
119
 
119
 
120
    ta->capabilities = 0;
120
    ta->capabilities = 0;
121
    ta->accept_new_threads = true;
121
    ta->accept_new_threads = true;
-
 
122
    ta->cycles = 0;
122
   
123
   
123
    ipc_answerbox_init(&ta->answerbox);
124
    ipc_answerbox_init(&ta->answerbox);
124
    for (i = 0; i < IPC_MAX_PHONES; i++)
125
    for (i = 0; i < IPC_MAX_PHONES; i++)
125
        ipc_phone_init(&ta->phones[i]);
126
        ipc_phone_init(&ta->phones[i]);
126
    if ((ipc_phone_0) && (context_check(ipc_phone_0->task->context, ta->context)))
127
    if ((ipc_phone_0) && (context_check(ipc_phone_0->task->context, ta->context)))
Line 264... Line 265...
264
    btree_node_t *leaf;
265
    btree_node_t *leaf;
265
   
266
   
266
    return (task_t *) btree_search(&tasks_btree, (btree_key_t) id, &leaf);
267
    return (task_t *) btree_search(&tasks_btree, (btree_key_t) id, &leaf);
267
}
268
}
268
 
269
 
-
 
270
/** Get accounting data of given task.
-
 
271
 *
-
 
272
 * Note that task_lock on @t must be already held and
-
 
273
 * interrupts must be already disabled.
-
 
274
 *
-
 
275
 * @param t Pointer to thread.
-
 
276
 *
-
 
277
 */
-
 
278
uint64_t task_get_accounting(task_t *t)
-
 
279
{
-
 
280
    /* Accumulated value of task */
-
 
281
    uint64_t ret = t->cycles;
-
 
282
   
-
 
283
    /* Current values of threads */
-
 
284
    link_t *cur;
-
 
285
    for (cur = t->th_head.next; cur != &t->th_head; cur = cur->next) {
-
 
286
        thread_t *thr = list_get_instance(cur, thread_t, th_link);
-
 
287
       
-
 
288
        spinlock_lock(&thr->lock);
-
 
289
       
-
 
290
        if (thr == THREAD) /* Update accounting of current thread */
-
 
291
            thread_update_accounting();
-
 
292
        ret += thr->cycles;
-
 
293
       
-
 
294
        spinlock_unlock(&thr->lock);
-
 
295
    }
-
 
296
   
-
 
297
    return ret;
-
 
298
}
-
 
299
 
269
/** Kill task.
300
/** Kill task.
270
 *
301
 *
271
 * @param id ID of the task to be killed.
302
 * @param id ID of the task to be killed.
272
 *
303
 *
273
 * @return 0 on success or an error code from errno.h
304
 * @return 0 on success or an error code from errno.h
Line 342... Line 373...
342
   
373
   
343
    /* Messing with thread structures, avoid deadlock */
374
    /* Messing with thread structures, avoid deadlock */
344
    ipl = interrupts_disable();
375
    ipl = interrupts_disable();
345
    spinlock_lock(&tasks_lock);
376
    spinlock_lock(&tasks_lock);
346
   
377
   
347
    printf("taskid name       ctx address    as         active calls callee\n");
378
    printf("taskid name       ctx address    as         cycles     threads calls  callee\n");
348
    printf("------ ---------- --- ---------- ---------- ------------ ------>\n");
379
    printf("------ ---------- --- ---------- ---------- ---------- ------- ------ ------>\n");
349
 
380
 
350
    for (cur = tasks_btree.leaf_head.next; cur != &tasks_btree.leaf_head; cur = cur->next) {
381
    for (cur = tasks_btree.leaf_head.next; cur != &tasks_btree.leaf_head; cur = cur->next) {
351
        btree_node_t *node;
382
        btree_node_t *node;
352
        int i;
383
        int i;
353
       
384
       
Line 357... Line 388...
357
            int j;
388
            int j;
358
 
389
 
359
            t = (task_t *) node->value[i];
390
            t = (task_t *) node->value[i];
360
       
391
       
361
            spinlock_lock(&t->lock);
392
            spinlock_lock(&t->lock);
-
 
393
           
-
 
394
            uint64_t cycles = task_get_accounting(t);
-
 
395
            char suffix;
-
 
396
           
-
 
397
            if (cycles > 1000000000000000000LL) {
-
 
398
                cycles = cycles / 1000000000000000000LL;
-
 
399
                suffix = 'E';
-
 
400
            } else if (cycles > 1000000000000LL) {
-
 
401
                cycles = cycles / 1000000000000LL;
-
 
402
                suffix = 'T';
-
 
403
            } else if (cycles > 1000000LL) {
-
 
404
                cycles = cycles / 1000000LL;
-
 
405
                suffix = 'M';
-
 
406
            } else
-
 
407
                suffix = ' ';
-
 
408
           
362
            printf("%-6lld %-10s %-3ld %#10zx %#10zx %12zd", t->taskid, t->name, t->context, t, t->as, atomic_get(&t->active_calls));
409
            printf("%-6lld %-10s %-3ld %#10zx %#10zx %9llu%c %7zd %6zd", t->taskid, t->name, t->context, t, t->as, cycles, suffix, t->refcount, atomic_get(&t->active_calls));
363
            for (j = 0; j < IPC_MAX_PHONES; j++) {
410
            for (j = 0; j < IPC_MAX_PHONES; j++) {
364
                if (t->phones[j].callee)
411
                if (t->phones[j].callee)
365
                    printf(" %zd:%#zx", j, t->phones[j].callee);
412
                    printf(" %zd:%#zx", j, t->phones[j].callee);
366
            }
413
            }
367
            printf("\n");
414
            printf("\n");
-
 
415
           
368
            spinlock_unlock(&t->lock);
416
            spinlock_unlock(&t->lock);
369
        }
417
        }
370
    }
418
    }
371
 
419
 
372
    spinlock_unlock(&tasks_lock);
420
    spinlock_unlock(&tasks_lock);