Changeset abf3564 in mainline for uspace/app/trace/ipcp.c


Ignore:
Timestamp:
2008-09-18T22:19:42Z (16 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f7176b1
Parents:
073c9e6
Message:

trace: Decode protocol-level call arguments, response retvals and arguments.

File:
1 edited

Legend:

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

    r073c9e6 rabf3564  
    4747        int phone_hash;
    4848        ipc_call_t question;
     49        oper_t *oper;
    4950
    5051        int call_hash;
     
    146147        oper_t *oper;
    147148
     149        val_type_t arg_def[OPER_MAX_ARGS] = {
     150                V_INTEGER,
     151                V_INTEGER,
     152                V_INTEGER,
     153                V_INTEGER,
     154                V_INTEGER               
     155        };
     156
    148157        /*
    149158         * Create a pseudo-protocol 'unknown' that has no known methods.
     
    159168        desc = ipc_methods;
    160169        while (desc->number != 0) {
    161                 oper = oper_new(desc->name);
     170                oper = oper_new(desc->name, OPER_MAX_ARGS, arg_def, V_INTEGER,
     171                        OPER_MAX_ARGS, arg_def);
    162172                proto_add_oper(proto_system, desc->number, oper);
    163173
     
    180190        unsigned long key[1];
    181191        oper_t *oper;
     192        ipcarg_t *args;
     193        int i;
    182194
    183195        if (have_conn[phone]) proto = connections[phone].proto;
    184196        else proto = NULL;
     197
     198        args = call->args;
    185199
    186200        if ((display_mask & DM_IPC) != 0) {
     
    188202                        phone, (proto ? proto->name : "n/a"));
    189203                ipc_m_print(proto, IPC_GET_METHOD(*call));
    190                 printf(" args: (%u, %u, %u, %u, %u)\n",
    191                     IPC_GET_ARG1(*call),
    192                     IPC_GET_ARG2(*call),
    193                     IPC_GET_ARG3(*call),
    194                     IPC_GET_ARG4(*call),
    195                     IPC_GET_ARG5(*call)
    196                 );
     204                printf(" args: (%u, %u, %u, %u, %u)\n", args[1], args[2],
     205                    args[3], args[4], args[5]);
    197206        }
    198207
     
    211220                            phone, (oper ? oper->name : "unknown"));
    212221
    213                         printf("(%u, %u, %u, %u, %u)\n",
    214                             IPC_GET_ARG1(*call),
    215                             IPC_GET_ARG2(*call),
    216                             IPC_GET_ARG3(*call),
    217                             IPC_GET_ARG4(*call),
    218                             IPC_GET_ARG5(*call)
    219                         );
    220                 }
     222                        putchar('(');
     223                        for (i = 1; i <= oper->argc; ++i) {
     224                                if (i > 1) printf(", ");
     225                                val_print(args[i], oper->arg_type[i - 1]);
     226                        }
     227                        putchar(')');
     228
     229                        if (oper->rv_type == V_VOID && oper->respc == 0) {
     230                                /*
     231                                 * No response data (typically the task will
     232                                 * not be interested in the response).
     233                                 * We will not display response.
     234                                 */
     235                                putchar('.');
     236                        }
     237
     238                        putchar('\n');
     239                }
     240        } else {
     241                oper = NULL;
    221242        }
    222243
     
    227248        pcall->question = *call;
    228249        pcall->call_hash = hash;
     250        pcall->oper = oper;
    229251
    230252        key[0] = hash;
     
    243265        int cphone;
    244266
     267        ipcarg_t *resp;
     268        oper_t *oper;
     269        int i;
     270
    245271//      printf("parse_answer\n");
    246272
     
    248274        method = IPC_GET_METHOD(pcall->question);
    249275        retval = IPC_GET_RETVAL(*answer);
     276
     277        resp = answer->args;
    250278
    251279        if ((display_mask & DM_IPC) != 0) {
     
    257285
    258286        if ((display_mask & DM_USER) != 0) {
    259                 printf("-> %d\n", retval);
     287                oper = pcall->oper;
     288
     289                if (oper->rv_type != V_VOID || oper->respc > 0) {
     290                        printf("->");
     291
     292                        if (oper->rv_type != V_VOID) {
     293                                putchar(' ');
     294                                val_print(retval, oper->rv_type);
     295                        }
     296                       
     297                        if (oper->respc > 0) {
     298                                putchar(' ');
     299                                putchar('(');
     300                                for (i = 1; i <= oper->respc; ++i) {
     301                                        if (i > 1) printf(", ");
     302                                        val_print(resp[i], oper->resp_type[i - 1]);
     303                                }
     304                                putchar(')');
     305                        }
     306
     307                        putchar('\n');
     308                }
    260309        }
    261310
Note: See TracChangeset for help on using the changeset viewer.