Changeset 47e0a05b in mainline


Ignore:
Timestamp:
2008-09-18T09:05:31Z (16 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4e5aa02
Parents:
2c57ee14
Message:

Allow trace to run programs and trace them (no more task IDs)

Location:
uspace
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/trace/trace.c

    r2c57ee14 r47e0a05b  
    4242#include <udebug.h>
    4343#include <async.h>
     44#include <task.h>
    4445
    4546// Temporary: service and method names
     
    129130        printf("Threads:");
    130131        for (i = 0; i < n_threads; i++) {
    131                 printf(" [%d] (hash 0x%u)", 1+i, thread_hash_buf[i]);
     132                printf(" [%d] (hash 0x%x)", 1+i, thread_hash_buf[i]);
    132133        }
    133134        printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
     
    541542static void print_syntax()
    542543{
    543         printf("Syntax: trace [+<events>] <task_id>\n");
     544        printf("Syntax:\n");
     545        printf("\ttrace [+<events>] <executable> [<arg1> [...]]\n");
     546        printf("or\ttrace [+<events>] -t <task_id>\n");
    544547        printf("Events: (default is +tp)\n");
    545548        printf("\n");
     
    549552        printf("\tp ... Protocol level\n");
    550553        printf("\n");
    551         printf("Example: trace +tsip 12\n");
     554        printf("Examples:\n");
     555        printf("\ttrace +s /app/tetris\n");
     556        printf("\ttrace +tsip -t 12\n");
    552557}
    553558
     
    581586        char *err_p;
    582587
     588        task_id = 0;
     589
    583590        --argc; ++argv;
    584591
    585         while (argc > 1) {
     592        while (argc > 0) {
    586593                arg = *argv;
    587594                if (arg[0] == '+') {
    588595                        display_mask = parse_display_mask(&arg[1]);
     596                } else if (arg[0] == '-') {
     597                        if (arg[1] == 't') {
     598                                /* Trace an already running task */
     599                                --argc; ++argv;
     600                                task_id = strtol(*argv, &err_p, 10);
     601                                if (*err_p) {
     602                                        printf("Task ID syntax error\n");
     603                                        print_syntax();
     604                                        return -1;
     605                                }
     606                        } else {
     607                                printf("Uknown option '%s'\n", arg[0]);
     608                                print_syntax();
     609                                return -1;
     610                        }
    589611                } else {
    590                         printf("Unexpected argument '%s'\n", arg);
    591                         print_syntax();
    592                         return -1;
     612                        break;
    593613                }
    594614
     
    596616        }
    597617
    598         if (argc != 1) {
     618        if (task_id != 0) {
     619                if (argc == 0) return;
     620                printf("Extra arguments\n");
     621                print_syntax();
     622                return -1;
     623        }
     624
     625        if (argc < 1) {
    599626                printf("Missing argument\n");
    600627                print_syntax();
    601                 return 1;
    602         }
    603 
    604         task_id = strtol(*argv, &err_p, 10);
    605 
    606         if (*err_p) {
    607                 printf("Task ID syntax error\n");
    608                 print_syntax();
    609628                return -1;
    610629        }
     630
     631        /* Execute the specified command and trace the new task. */
     632        printf("Spawning '%s' with arguments:\n", *argv);
     633        {
     634                char **cp = argv;
     635                while (*cp) printf("'%s'\n", *cp++);
     636        }
     637        task_id = task_spawn(*argv, argv);
    611638
    612639        return 0;
  • uspace/lib/libc/generic/task.c

    r2c57ee14 r47e0a05b  
    134134        char *pa;
    135135        size_t pa_len;
     136        task_id_t task_id;
    136137
    137138        pa = absolutize(path, &pa_len);
     
    152153                return 0;
    153154
     155        /* Get task ID. */
     156        req = async_send_0(phone_id, LOADER_GET_TASKID, &answer);
     157        rc = ipc_data_read_start(phone_id, &task_id, sizeof(task_id));
     158        if (rc != EOK) {
     159                async_wait_for(req, NULL);
     160                goto error;
     161        }
     162
     163        async_wait_for(req, &retval);
     164        if (retval != EOK)
     165                goto error;
     166
    154167        /* Send program pathname */
    155168        req = async_send_0(phone_id, LOADER_SET_PATHNAME, &answer);
     
    176189        /* Success */
    177190        ipc_hangup(phone_id);
    178         return 1;
     191        return task_id;
    179192
    180193        /* Error exit */
  • uspace/lib/libc/include/ipc/loader.h

    r2c57ee14 r47e0a05b  
    4040typedef enum {
    4141        LOADER_HELLO = IPC_FIRST_USER_METHOD,
     42        LOADER_GET_TASKID,
    4243        LOADER_SET_PATHNAME,
    4344        LOADER_SET_ARGS,
  • uspace/srv/loader/main.c

    r2c57ee14 r47e0a05b  
    7878static char *arg_buf = NULL;
    7979
     80static int loader_get_taskid(ipc_callid_t rid, ipc_call_t *request)
     81{
     82        ipc_callid_t callid;
     83        task_id_t task_id;
     84        size_t len;
     85
     86        task_id = task_get_id();
     87
     88        if (!ipc_data_read_receive(&callid, &len)) {
     89                ipc_answer_0(callid, EINVAL);
     90                ipc_answer_0(rid, EINVAL);
     91                return;
     92        }
     93
     94        if (len > sizeof(task_id)) len = sizeof(task_id);
     95
     96        ipc_data_write_finalize(callid, &task_id, len);
     97        ipc_answer_0(rid, EOK);
     98}
     99
     100
    80101/** Receive a call setting pathname of the program to execute.
    81102 *
     
    275296//                      call.in_phone_hash, IPC_GET_METHOD(call));
    276297                switch (IPC_GET_METHOD(call)) {
     298                case LOADER_GET_TASKID:
     299                        loader_get_taskid(callid, &call);
     300                        continue;
    277301                case LOADER_SET_PATHNAME:
    278302                        loader_set_pathname(callid, &call);
Note: See TracChangeset for help on using the changeset viewer.