Changeset 8c125ad in mainline


Ignore:
Timestamp:
2008-09-17T15:36:34Z (16 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1643855
Parents:
c9a29d6
Message:

trace: Fix broken 'unknown' protocol, add 'system' protocol for more elegant handling of system IPC methods.

Location:
uspace/app/trace
Files:
3 edited

Legend:

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

    rc9a29d6 r8c125ad  
    6464hash_table_t pending_calls;
    6565
     66/*
     67 * Pseudo-protocols
     68 */
     69proto_t *proto_system;          /**< Protocol describing system IPC methods. */
     70proto_t *proto_unknown;         /**< Protocol with no known methods. */
     71
    6672static hash_index_t pending_call_hash(unsigned long key[]);
    6773static int pending_call_compare(unsigned long key[], hash_count_t keys,
     
    116122static void ipc_m_print(proto_t *proto, ipcarg_t method)
    117123{
     124        oper_t *oper;
     125
     126        /* Try system methods first */
     127        oper = proto_get_oper(proto_system, method);
     128
     129        if (oper == NULL && proto != NULL) {
     130                /* Not a system method, try the user protocol. */
     131                oper = proto_get_oper(proto, method);
     132        }
     133
     134        if (oper != NULL) {
     135                printf("%s (%d)", oper->name, method);
     136                return;
     137        }
     138
     139        printf("%d", method);
     140}
     141
     142void ipcp_init(void)
     143{
    118144        ipc_m_desc_t *desc;
    119145        oper_t *oper;
    120146
    121         /* FIXME: too slow */
     147        /*
     148         * Create a pseudo-protocol 'unknown' that has no known methods.
     149         */
     150        proto_unknown = proto_new("unknown");
     151
     152        /*
     153         * Create a pseudo-protocol 'system' defining names of system IPC
     154         * methods.
     155         */
     156        proto_system = proto_new("system");
     157
    122158        desc = ipc_methods;
    123159        while (desc->number != 0) {
    124                 if (desc->number == method) {
    125                         printf("%s (%d)", desc->name, method);
    126                         return;
    127                 }
     160                oper = oper_new(desc->name);
     161                proto_add_oper(proto_system, desc->number, oper);
    128162
    129163                ++desc;
    130164        }
    131165
    132         if (proto != NULL) {
    133                 oper = proto_get_oper(proto, method);
    134                 if (oper != NULL) {
    135                         printf("%s (%d)", oper->name, method);
    136                         return;
    137                 }
    138         }
    139 
    140         printf("%d", method);
    141 }
    142 
    143 void ipcp_init(void)
    144 {
    145166        hash_table_create(&pending_calls, PCALL_TABLE_CHAINS, 1, &pending_call_ops);
    146167}
     
    148169void ipcp_cleanup(void)
    149170{
     171        proto_delete(proto_system);
    150172        hash_table_destroy(&pending_calls);
    151173}
     
    190212        ipcarg_t service;
    191213        int retval;
    192         static proto_t proto_unknown = { .name = "unknown" };
    193214        proto_t *proto;
    194215        int cphone;
     
    206227                service = IPC_GET_ARG1(pcall->question);
    207228                proto = proto_get_by_srv(service);
    208                 if (proto == NULL) proto = &proto_unknown;
     229                if (proto == NULL) proto = proto_unknown;
    209230
    210231                cphone = IPC_GET_ARG5(*answer);
  • uspace/app/trace/proto.c

    rc9a29d6 r8c125ad  
    173173}
    174174
     175void proto_delete(proto_t *proto)
     176{
     177        free(proto);
     178}
     179
    175180void proto_add_oper(proto_t *proto, int method, oper_t *oper)
    176181{
  • uspace/app/trace/proto.h

    rc9a29d6 r8c125ad  
    5959proto_t *proto_get_by_srv(int srv);
    6060proto_t *proto_new(char *name);
     61void proto_delete(proto_t *proto);
    6162void proto_add_oper(proto_t *proto, int method, oper_t *oper);
    6263oper_t *proto_get_oper(proto_t *proto, int method);
Note: See TracChangeset for help on using the changeset viewer.