Ignore:
File:
1 edited

Legend:

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

    r4e00f87 rffa2c8ef  
    4040#include "proto.h"
    4141
    42 
    43 /* Maps service number to protocol */
    44 static hash_table_t srv_proto;
     42#define SRV_PROTO_TABLE_CHAINS 32
     43#define METHOD_OPER_TABLE_CHAINS 32
     44
     45hash_table_t srv_proto;
    4546
    4647typedef struct {
    47         int srv;
     48        unsigned srv;
    4849        proto_t *proto;
    49         ht_link_t link;
     50        link_t link;
    5051} srv_proto_t;
    5152
    5253typedef struct {
    53         int method;
     54        sysarg_t method;
    5455        oper_t *oper;
    55         ht_link_t link;
     56        link_t link;
    5657} method_oper_t;
    5758
    58 /* Hash table operations. */
    59 
    60 static size_t srv_proto_key_hash(void *key)
    61 {
    62         return *(int *)key;
    63 }
    64 
    65 static size_t srv_proto_hash(const ht_link_t *item)
    66 {
    67         srv_proto_t *sp = hash_table_get_inst(item, srv_proto_t, link);
    68         return sp->srv;
    69 }
    70 
    71 static bool srv_proto_key_equal(void *key, const ht_link_t *item)
    72 {
    73         srv_proto_t *sp = hash_table_get_inst(item, srv_proto_t, link);
    74         return sp->srv == *(int *)key;
    75 }
    76 
    77 static hash_table_ops_t srv_proto_ops = {
     59static hash_index_t srv_proto_hash(unsigned long key[]);
     60static int srv_proto_compare(unsigned long key[], hash_count_t keys,
     61    link_t *item);
     62static void srv_proto_remove_callback(link_t *item);
     63
     64hash_table_operations_t srv_proto_ops = {
    7865        .hash = srv_proto_hash,
    79         .key_hash = srv_proto_key_hash,
    80         .key_equal = srv_proto_key_equal,
    81         .equal = NULL,
    82         .remove_callback = NULL
     66        .compare = srv_proto_compare,
     67        .remove_callback = srv_proto_remove_callback
    8368};
    8469
    85 
    86 static size_t method_oper_key_hash(void *key)
    87 {
    88         return *(int *)key;
    89 }
    90 
    91 static size_t method_oper_hash(const ht_link_t *item)
    92 {
    93         method_oper_t *mo = hash_table_get_inst(item, method_oper_t, link);
    94         return mo->method;
    95 }
    96 
    97 static bool method_oper_key_equal(void *key, const ht_link_t *item)
    98 {
    99         method_oper_t *mo = hash_table_get_inst(item, method_oper_t, link);
    100         return mo->method == *(int *)key;
    101 }
    102 
    103 static hash_table_ops_t method_oper_ops = {
     70static hash_index_t method_oper_hash(unsigned long key[]);
     71static int method_oper_compare(unsigned long key[], hash_count_t keys,
     72    link_t *item);
     73static void method_oper_remove_callback(link_t *item);
     74
     75hash_table_operations_t method_oper_ops = {
    10476        .hash = method_oper_hash,
    105         .key_hash = method_oper_key_hash,
    106         .key_equal = method_oper_key_equal,
    107         .equal = NULL,
    108         .remove_callback = NULL
     77        .compare = method_oper_compare,
     78        .remove_callback = method_oper_remove_callback
    10979};
    11080
     81static hash_index_t srv_proto_hash(unsigned long key[])
     82{
     83        return key[0] % SRV_PROTO_TABLE_CHAINS;
     84}
     85
     86static int srv_proto_compare(unsigned long key[], hash_count_t keys,
     87    link_t *item)
     88{
     89        srv_proto_t *sp;
     90
     91        sp = hash_table_get_instance(item, srv_proto_t, link);
     92
     93        return key[0] == sp->srv;
     94}
     95
     96static void srv_proto_remove_callback(link_t *item)
     97{
     98}
     99
     100static hash_index_t method_oper_hash(unsigned long key[])
     101{
     102        return key[0] % METHOD_OPER_TABLE_CHAINS;
     103}
     104
     105static int method_oper_compare(unsigned long key[], hash_count_t keys,
     106    link_t *item)
     107{
     108        method_oper_t *mo;
     109
     110        mo = hash_table_get_instance(item, method_oper_t, link);
     111
     112        return key[0] == mo->method;
     113}
     114
     115static void method_oper_remove_callback(link_t *item)
     116{
     117}
     118
    111119
    112120void proto_init(void)
    113121{
    114         /* todo: check return value. */
    115         bool ok = hash_table_create(&srv_proto, 0, 0, &srv_proto_ops);
    116         assert(ok);
     122        hash_table_create(&srv_proto, SRV_PROTO_TABLE_CHAINS, 1,
     123            &srv_proto_ops);
    117124}
    118125
     
    125132{
    126133        srv_proto_t *sp;
     134        unsigned long key;
    127135
    128136        sp = malloc(sizeof(srv_proto_t));
    129137        sp->srv = srv;
    130138        sp->proto = proto;
    131 
    132         hash_table_insert(&srv_proto, &sp->link);
     139        key = srv;
     140
     141        hash_table_insert(&srv_proto, &key, &sp->link);
    133142}
    134143
    135144proto_t *proto_get_by_srv(int srv)
    136145{
    137         ht_link_t *item = hash_table_find(&srv_proto, &srv);
     146        unsigned long key;
     147        link_t *item;
     148        srv_proto_t *sp;
     149
     150        key = srv;
     151        item = hash_table_find(&srv_proto, &key);
    138152        if (item == NULL) return NULL;
    139153
    140         srv_proto_t *sp = hash_table_get_inst(item, srv_proto_t, link);
     154        sp = hash_table_get_instance(item, srv_proto_t, link);
    141155        return sp->proto;
    142156}
     
    145159{
    146160        proto->name = name;
    147         /* todo: check return value. */
    148         bool ok = hash_table_create(&proto->method_oper, 0, 0, &method_oper_ops);
    149         assert(ok);
     161        hash_table_create(&proto->method_oper, SRV_PROTO_TABLE_CHAINS, 1,
     162            &method_oper_ops);
    150163}
    151164
     
    168181{
    169182        method_oper_t *mo;
     183        unsigned long key;
    170184
    171185        mo = malloc(sizeof(method_oper_t));
    172186        mo->method = method;
    173187        mo->oper = oper;
    174 
    175         hash_table_insert(&proto->method_oper, &mo->link);     
     188        key = method;
     189
     190        hash_table_insert(&proto->method_oper, &key, &mo->link);       
    176191}
    177192
    178193oper_t *proto_get_oper(proto_t *proto, int method)
    179194{
    180         ht_link_t *item = hash_table_find(&proto->method_oper, &method);
     195        unsigned long key;
     196        link_t *item;
     197        method_oper_t *mo;
     198
     199        key = method;
     200        item = hash_table_find(&proto->method_oper, &key);
    181201        if (item == NULL) return NULL;
    182202
    183         method_oper_t *mo = hash_table_get_inst(item, method_oper_t, link);
     203        mo = hash_table_get_instance(item, method_oper_t, link);
    184204        return mo->oper;
    185205}
Note: See TracChangeset for help on using the changeset viewer.