Subversion Repositories HelenOS

Rev

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

Rev 3623 Rev 4377
Line 50... Line 50...
50
#include <ipc/ipc.h>
50
#include <ipc/ipc.h>
51
#include <ipc/ipcrsc.h>
51
#include <ipc/ipcrsc.h>
52
#include <print.h>
52
#include <print.h>
53
#include <errno.h>
53
#include <errno.h>
54
#include <func.h>
54
#include <func.h>
-
 
55
#include <string.h>
55
#include <syscall/copy.h>
56
#include <syscall/copy.h>
56
 
57
 
57
/** Spinlock protecting the tasks_tree AVL tree. */
58
/** Spinlock protecting the tasks_tree AVL tree. */
58
SPINLOCK_INITIALIZE(tasks_lock);
59
SPINLOCK_INITIALIZE(tasks_lock);
59
 
60
 
Line 148... Line 149...
148
    spinlock_initialize(&ta->lock, "task_ta_lock");
149
    spinlock_initialize(&ta->lock, "task_ta_lock");
149
    list_initialize(&ta->th_head);
150
    list_initialize(&ta->th_head);
150
    ta->as = as;
151
    ta->as = as;
151
 
152
 
152
    memcpy(ta->name, name, TASK_NAME_BUFLEN);
153
    memcpy(ta->name, name, TASK_NAME_BUFLEN);
153
    ta->name[TASK_NAME_BUFLEN - 1] = '\0';
154
    ta->name[TASK_NAME_BUFLEN - 1] = 0;
154
 
155
 
155
    atomic_set(&ta->refcount, 0);
156
    atomic_set(&ta->refcount, 0);
156
    atomic_set(&ta->lifecount, 0);
157
    atomic_set(&ta->lifecount, 0);
157
    ta->context = CONTEXT;
158
    ta->context = CONTEXT;
158
 
159
 
Line 247... Line 248...
247
     */
248
     */
248
    return (unative_t) copy_to_uspace(uspace_task_id, &TASK->taskid,
249
    return (unative_t) copy_to_uspace(uspace_task_id, &TASK->taskid,
249
        sizeof(TASK->taskid));
250
        sizeof(TASK->taskid));
250
}
251
}
251
 
252
 
-
 
253
/** Syscall for setting the task name.
-
 
254
 *
-
 
255
 * The name simplifies identifying the task in the task list.
-
 
256
 *
-
 
257
 * @param name  The new name for the task. (typically the same
-
 
258
 *      as the command used to execute it).
-
 
259
 *
-
 
260
 * @return 0 on success or an error code from @ref errno.h.
-
 
261
 */
-
 
262
unative_t sys_task_set_name(const char *uspace_name, size_t name_len)
-
 
263
{
-
 
264
    int rc;
-
 
265
    char namebuf[TASK_NAME_BUFLEN];
-
 
266
 
-
 
267
    /* Cap length of name and copy it from userspace. */
-
 
268
 
-
 
269
    if (name_len > TASK_NAME_BUFLEN - 1)
-
 
270
        name_len = TASK_NAME_BUFLEN - 1;
-
 
271
 
-
 
272
    rc = copy_from_uspace(namebuf, uspace_name, name_len);
-
 
273
    if (rc != 0)
-
 
274
        return (unative_t) rc;
-
 
275
 
-
 
276
    namebuf[name_len] = '\0';
-
 
277
    str_cpy(TASK->name, TASK_NAME_BUFLEN, namebuf);
-
 
278
 
-
 
279
    return EOK;
-
 
280
}
-
 
281
 
252
/** Find task structure corresponding to task ID.
282
/** Find task structure corresponding to task ID.
253
 *
283
 *
254
 * The tasks_lock must be already held by the caller of this function and
284
 * The tasks_lock must be already held by the caller of this function and
255
 * interrupts must be disabled.
285
 * interrupts must be disabled.
256
 *
286
 *
Line 337... Line 367...
337
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
367
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
338
        thread_t *thr;
368
        thread_t *thr;
339
        bool sleeping = false;
369
        bool sleeping = false;
340
       
370
       
341
        thr = list_get_instance(cur, thread_t, th_link);
371
        thr = list_get_instance(cur, thread_t, th_link);
342
           
372
       
343
        spinlock_lock(&thr->lock);
373
        spinlock_lock(&thr->lock);
344
        thr->interrupted = true;
374
        thr->interrupted = true;
345
        if (thr->state == Sleeping)
375
        if (thr->state == Sleeping)
346
            sleeping = true;
376
            sleeping = true;
347
        spinlock_unlock(&thr->lock);
377
        spinlock_unlock(&thr->lock);
Line 365... Line 395...
365
    uint64_t cycles;
395
    uint64_t cycles;
366
    char suffix;
396
    char suffix;
367
    order(task_get_accounting(t), &cycles, &suffix);
397
    order(task_get_accounting(t), &cycles, &suffix);
368
 
398
 
369
#ifdef __32_BITS__  
399
#ifdef __32_BITS__  
370
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %10p %10p %9" PRIu64
400
    printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %10p %10p %9" PRIu64
371
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
401
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
372
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
402
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
373
#endif
403
#endif
374
 
404
 
375
#ifdef __64_BITS__
405
#ifdef __64_BITS__
376
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %18p %18p %9" PRIu64
406
    printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %18p %18p %9" PRIu64
377
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
407
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
378
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
408
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
379
#endif
409
#endif
380
 
410
 
381
    for (j = 0; j < IPC_MAX_PHONES; j++) {
411
    for (j = 0; j < IPC_MAX_PHONES; j++) {
Line 396... Line 426...
396
    /* Messing with task structures, avoid deadlock */
426
    /* Messing with task structures, avoid deadlock */
397
    ipl = interrupts_disable();
427
    ipl = interrupts_disable();
398
    spinlock_lock(&tasks_lock);
428
    spinlock_lock(&tasks_lock);
399
 
429
 
400
#ifdef __32_BITS__  
430
#ifdef __32_BITS__  
401
    printf("taskid name       ctx address    as         "
431
    printf("taskid name         ctx address    as         "
402
        "cycles     threads calls  callee\n");
432
        "cycles     threads calls  callee\n");
403
    printf("------ ---------- --- ---------- ---------- "
433
    printf("------ ------------ --- ---------- ---------- "
404
        "---------- ------- ------ ------>\n");
434
        "---------- ------- ------ ------>\n");
405
#endif
435
#endif
406
 
436
 
407
#ifdef __64_BITS__
437
#ifdef __64_BITS__
408
    printf("taskid name       ctx address            as                 "
438
    printf("taskid name         ctx address            as                 "
409
        "cycles     threads calls  callee\n");
439
        "cycles     threads calls  callee\n");
410
    printf("------ ---------- --- ------------------ ------------------ "
440
    printf("------ ------------ --- ------------------ ------------------ "
411
        "---------- ------- ------ ------>\n");
441
        "---------- ------- ------ ------>\n");
412
#endif
442
#endif
413
 
443
 
414
    avltree_walk(&tasks_tree, task_print_walker, NULL);
444
    avltree_walk(&tasks_tree, task_print_walker, NULL);
415
 
445