Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/task.c

    r19f857a re535eeb  
    3333/**
    3434 * @file
    35  * @brief       Task management.
     35 * @brief Task management.
    3636 */
    3737
     
    6666 * The task is guaranteed to exist after it was found in the tasks_tree as
    6767 * long as:
     68 *
    6869 * @li the tasks_lock is held,
    6970 * @li the task's lock is held when task's lock is acquired before releasing
     
    99100        task_t *t = avltree_get_instance(node, task_t, tasks_tree_node);
    100101        unsigned *cnt = (unsigned *) arg;
    101 
     102       
    102103        if (t != TASK) {
    103104                (*cnt)++;
     
    107108                task_kill_internal(t);
    108109        }
    109 
    110         return true;    /* continue the walk */
     110       
     111        /* Continue the walk */
     112        return true;
    111113}
    112114
     
    115117{
    116118        unsigned tasks_left;
    117 
     119       
    118120        do { /* Repeat until there are any tasks except TASK */
    119121                /* Messing with task structures, avoid deadlock */
     
    138140        task_t *ta = obj;
    139141        int i;
    140 
     142       
    141143        atomic_set(&ta->refcount, 0);
    142144        atomic_set(&ta->lifecount, 0);
    143145        atomic_set(&ta->active_calls, 0);
    144 
     146       
    145147        spinlock_initialize(&ta->lock, "task_ta_lock");
    146148        mutex_initialize(&ta->futexes_lock, MUTEX_PASSIVE);
    147 
     149       
    148150        list_initialize(&ta->th_head);
    149151        list_initialize(&ta->sync_box_head);
    150 
     152       
    151153        ipc_answerbox_init(&ta->answerbox, ta);
    152154        for (i = 0; i < IPC_MAX_PHONES; i++)
    153155                ipc_phone_init(&ta->phones[i]);
    154 
     156       
    155157#ifdef CONFIG_UDEBUG
    156158        /* Init kbox stuff */
     
    159161        mutex_initialize(&ta->kb.cleanup_lock, MUTEX_PASSIVE);
    160162#endif
    161 
     163       
    162164        return 0;
    163165}
     
    165167/** Create new task with no threads.
    166168 *
    167  * @param as            Task's address space.
    168  * @param name          Symbolic name (a copy is made).
    169  *
    170  * @return              New task's structure.
     169 * @param as   Task's address space.
     170 * @param name Symbolic name (a copy is made).
     171 *
     172 * @return New task's structure.
    171173 *
    172174 */
     
    181183        memcpy(ta->name, name, TASK_NAME_BUFLEN);
    182184        ta->name[TASK_NAME_BUFLEN - 1] = 0;
    183 
     185       
    184186        ta->context = CONTEXT;
    185187        ta->capabilities = 0;
    186         ta->cycles = 0;
     188        ta->ucycles = 0;
     189        ta->kcycles = 0;
     190
     191        ta->ipc_info.call_sent = 0;
     192        ta->ipc_info.call_recieved = 0;
     193        ta->ipc_info.answer_sent = 0;
     194        ta->ipc_info.answer_recieved = 0;
     195        ta->ipc_info.irq_notif_recieved = 0;
     196        ta->ipc_info.forwarded = 0;
    187197
    188198#ifdef CONFIG_UDEBUG
    189199        /* Init debugging stuff */
    190200        udebug_task_init(&ta->udebug);
    191 
     201       
    192202        /* Init kbox stuff */
    193203        ta->kb.finished = false;
    194204#endif
    195 
     205       
    196206        if ((ipc_phone_0) &&
    197207            (context_check(ipc_phone_0->task->context, ta->context)))
    198208                ipc_phone_connect(&ta->phones[0], ipc_phone_0);
    199 
     209       
    200210        btree_create(&ta->futexes);
    201211       
     
    215225/** Destroy task.
    216226 *
    217  * @param t             Task to be destroyed.
     227 * @param t Task to be destroyed.
     228 *
    218229 */
    219230void task_destroy(task_t *t)
     
    225236        avltree_delete(&tasks_tree, &t->tasks_tree_node);
    226237        spinlock_unlock(&tasks_lock);
    227 
     238       
    228239        /*
    229240         * Perform architecture specific task destruction.
    230241         */
    231242        task_destroy_arch(t);
    232 
     243       
    233244        /*
    234245         * Free up dynamically allocated state.
    235246         */
    236247        btree_destroy(&t->futexes);
    237 
     248       
    238249        /*
    239250         * Drop our reference to the address space.
     
    248259/** Syscall for reading task ID from userspace.
    249260 *
    250  * @param               uspace_task_id userspace address of 8-byte buffer
    251  *                      where to store current task ID.
    252  *
    253  * @return              Zero on success or an error code from @ref errno.h.
     261 * @param uspace_task_id Userspace address of 8-byte buffer
     262 *                       where to store current task ID.
     263 *
     264 * @return Zero on success or an error code from @ref errno.h.
     265 *
    254266 */
    255267unative_t sys_task_get_id(task_id_t *uspace_task_id)
     
    267279 * The name simplifies identifying the task in the task list.
    268280 *
    269  * @param name  The new name for the task. (typically the same
    270  *              as the command used to execute it).
     281 * @param name The new name for the task. (typically the same
     282 *             as the command used to execute it).
    271283 *
    272284 * @return 0 on success or an error code from @ref errno.h.
     285 *
    273286 */
    274287unative_t sys_task_set_name(const char *uspace_name, size_t name_len)
     
    276289        int rc;
    277290        char namebuf[TASK_NAME_BUFLEN];
    278 
     291       
    279292        /* Cap length of name and copy it from userspace. */
    280 
     293       
    281294        if (name_len > TASK_NAME_BUFLEN - 1)
    282295                name_len = TASK_NAME_BUFLEN - 1;
    283 
     296       
    284297        rc = copy_from_uspace(namebuf, uspace_name, name_len);
    285298        if (rc != 0)
    286299                return (unative_t) rc;
    287 
     300       
    288301        namebuf[name_len] = '\0';
    289302        str_cpy(TASK->name, TASK_NAME_BUFLEN, namebuf);
    290 
     303       
    291304        return EOK;
    292305}
     
    297310 * interrupts must be disabled.
    298311 *
    299  * @param id            Task ID.
    300  *
    301  * @return              Task structure address or NULL if there is no such task
    302  *                      ID.
    303  */
    304 task_t *task_find_by_id(task_id_t id) { avltree_node_t *node;
    305        
    306         node = avltree_search(&tasks_tree, (avltree_key_t) id);
    307 
     312 * @param id Task ID.
     313 *
     314 * @return Task structure address or NULL if there is no such task ID.
     315 *
     316 */
     317task_t *task_find_by_id(task_id_t id)
     318{
     319        avltree_node_t *node =
     320            avltree_search(&tasks_tree, (avltree_key_t) id);
     321       
    308322        if (node)
    309323                return avltree_get_instance(node, task_t, tasks_tree_node);
     324       
    310325        return NULL;
    311326}
     
    316331 * already disabled.
    317332 *
    318  * @param t             Pointer to thread.
    319  *
    320  * @return              Number of cycles used by the task and all its threads
    321  *                      so far.
    322  */
    323 uint64_t task_get_accounting(task_t *t)
    324 {
    325         /* Accumulated value of task */
    326         uint64_t ret = t->cycles;
     333 * @param t       Pointer to thread.
     334 * @param ucycles Out pointer to sum of all user cycles.
     335 * @param kcycles Out pointer to sum of all kernel cycles.
     336 *
     337 */
     338void task_get_accounting(task_t *t, uint64_t *ucycles, uint64_t *kcycles)
     339{
     340        /* Accumulated values of task */
     341        uint64_t uret = t->ucycles;
     342        uint64_t kret = t->kcycles;
    327343       
    328344        /* Current values of threads */
     
    336352                        if (thr == THREAD) {
    337353                                /* Update accounting of current thread */
    338                                 thread_update_accounting();
     354                                thread_update_accounting(false);
    339355                        }
    340                         ret += thr->cycles;
     356                        uret += thr->ucycles;
     357                        kret += thr->kcycles;
    341358                }
    342359                spinlock_unlock(&thr->lock);
    343360        }
    344361       
    345         return ret;
     362        *ucycles = uret;
     363        *kcycles = kret;
    346364}
    347365
     
    349367{
    350368        link_t *cur;
    351 
     369       
    352370        /*
    353371         * Interrupt all threads.
     
    377395 * It signals all the task's threads to bail it out.
    378396 *
    379  * @param id            ID of the task to be killed.
    380  *
    381  * @return              Zero on success or an error code from errno.h.
     397 * @param id ID of the task to be killed.
     398 *
     399 * @return Zero on success or an error code from errno.h.
     400 *
    382401 */
    383402int task_kill(task_id_t id)
     
    406425        task_t *t = avltree_get_instance(node, task_t, tasks_tree_node);
    407426        int j;
    408                
     427       
    409428        spinlock_lock(&t->lock);
    410                        
    411         uint64_t cycles;
    412         char suffix;
    413         order(task_get_accounting(t), &cycles, &suffix);
    414 
     429       
     430        uint64_t ucycles;
     431        uint64_t kcycles;
     432        char usuffix, ksuffix;
     433        task_get_accounting(t, &ucycles, &kcycles);
     434        order_suffix(ucycles, &ucycles, &usuffix);
     435        order_suffix(kcycles, &kcycles, &ksuffix);
     436       
    415437#ifdef __32_BITS__     
    416         printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %10p %10p %9" PRIu64
    417             "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
    418             suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
    419 #endif
    420 
     438        printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %10p %10p %9" PRIu64 "%c %9"
     439                PRIu64 "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as,
     440                ucycles, usuffix, kcycles, ksuffix, atomic_get(&t->refcount),
     441                atomic_get(&t->active_calls));
     442#endif
     443       
    421444#ifdef __64_BITS__
    422         printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %18p %18p %9" PRIu64
    423             "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
    424             suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
    425 #endif
    426 
     445        printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %18p %18p %9" PRIu64 "%c %9"
     446                PRIu64 "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as,
     447                ucycles, usuffix, kcycles, ksuffix, atomic_get(&t->refcount),
     448                atomic_get(&t->active_calls));
     449#endif
     450       
    427451        for (j = 0; j < IPC_MAX_PHONES; j++) {
    428452                if (t->phones[j].callee)
     
    430454        }
    431455        printf("\n");
    432                        
     456       
    433457        spinlock_unlock(&t->lock);
    434458        return true;
     
    443467        ipl = interrupts_disable();
    444468        spinlock_lock(&tasks_lock);
    445 
    446 #ifdef __32_BITS__     
    447         printf("taskid name         ctx address    as         "
    448             "cycles     threads calls  callee\n");
    449         printf("------ ------------ --- ---------- ---------- "
    450             "---------- ------- ------ ------>\n");
    451 #endif
    452 
     469       
     470#ifdef __32_BITS__
     471        printf("taskid name         ctx address    as        "
     472            " ucycles    kcycles    threads calls  callee\n");
     473        printf("------ ------------ --- ---------- ----------"
     474            " ---------- ---------- ------- ------ ------>\n");
     475#endif
     476       
    453477#ifdef __64_BITS__
    454         printf("taskid name         ctx address            as                 "
    455             "cycles     threads calls  callee\n");
    456         printf("------ ------------ --- ------------------ ------------------ "
    457             "---------- ------- ------ ------>\n");
    458 #endif
    459 
     478        printf("taskid name         ctx address            as                "
     479            " ucycles    kcycles    threads calls  callee\n");
     480        printf("------ ------------ --- ------------------ ------------------"
     481            " ---------- ---------- ---------- ------- ------ ------>\n");
     482#endif
     483       
    460484        avltree_walk(&tasks_tree, task_print_walker, NULL);
    461 
     485       
    462486        spinlock_unlock(&tasks_lock);
    463487        interrupts_restore(ipl);
Note: See TracChangeset for help on using the changeset viewer.