Ignore:
File:
1 edited

Legend:

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

    r4e00f87 r9d58539  
    3838#include <sys/typefmt.h>
    3939#include <abi/ipc/methods.h>
    40 #include <macros.h>
    4140#include "ipc_desc.h"
    4241#include "proto.h"
     
    5352        ipc_callid_t call_hash;
    5453
    55         ht_link_t link;
     54        link_t link;
    5655} pending_call_t;
    5756
     
    6564int have_conn[MAX_PHONE];
    6665
    67 static hash_table_t pending_calls;
     66#define PCALL_TABLE_CHAINS 32
     67hash_table_t pending_calls;
    6868
    6969/*
     
    7373proto_t *proto_unknown;         /**< Protocol with no known methods. */
    7474
    75 
    76 static size_t pending_call_key_hash(void *key)
    77 {
    78         ipc_callid_t *call_id = (ipc_callid_t *)key;
    79         return *call_id;
    80 }
    81 
    82 static size_t pending_call_hash(const ht_link_t *item)
    83 {
    84         pending_call_t *hs = hash_table_get_inst(item, pending_call_t, link);
    85         return hs->call_hash;
    86 }
    87 
    88 static bool pending_call_key_equal(void *key, const ht_link_t *item)
    89 {
    90         ipc_callid_t *call_id = (ipc_callid_t *)key;
    91         pending_call_t *hs = hash_table_get_inst(item, pending_call_t, link);
    92 
    93         return *call_id == hs->call_hash;
    94 }
    95 
    96 static hash_table_ops_t pending_call_ops = {
     75static hash_index_t pending_call_hash(unsigned long key[]);
     76static int pending_call_compare(unsigned long key[], hash_count_t keys,
     77    link_t *item);
     78static void pending_call_remove_callback(link_t *item);
     79
     80hash_table_operations_t pending_call_ops = {
    9781        .hash = pending_call_hash,
    98         .key_hash = pending_call_key_hash,
    99         .key_equal = pending_call_key_equal,
    100         .equal = NULL,
    101         .remove_callback = NULL
     82        .compare = pending_call_compare,
     83        .remove_callback = pending_call_remove_callback
    10284};
     85
     86
     87static hash_index_t pending_call_hash(unsigned long key[])
     88{
     89//      printf("pending_call_hash\n");
     90        return key[0] % PCALL_TABLE_CHAINS;
     91}
     92
     93static int pending_call_compare(unsigned long key[], hash_count_t keys,
     94    link_t *item)
     95{
     96        pending_call_t *hs;
     97
     98//      printf("pending_call_compare\n");
     99        hs = hash_table_get_instance(item, pending_call_t, link);
     100
     101        // FIXME: this will fail if sizeof(long) < sizeof(void *).
     102        return key[0] == hs->call_hash;
     103}
     104
     105static void pending_call_remove_callback(link_t *item)
     106{
     107//      printf("pending_call_remove_callback\n");
     108}
    103109
    104110
     
    171177        }
    172178
    173         bool ok = hash_table_create(&pending_calls, 0, 0, &pending_call_ops);
    174         assert(ok);
     179        hash_table_create(&pending_calls, PCALL_TABLE_CHAINS, 1, &pending_call_ops);
    175180}
    176181
     
    185190        pending_call_t *pcall;
    186191        proto_t *proto;
     192        unsigned long key[1];
    187193        oper_t *oper;
    188194        sysarg_t *args;
     
    248254        pcall->oper = oper;
    249255
    250         hash_table_insert(&pending_calls, &pcall->link);
     256        key[0] = hash;
     257
     258        hash_table_insert(&pending_calls, key, &pcall->link);
    251259}
    252260
     
    326334void ipcp_call_in(ipc_call_t *call, ipc_callid_t hash)
    327335{
    328         ht_link_t *item;
     336        link_t *item;
    329337        pending_call_t *pcall;
     338        unsigned long key[1];
    330339       
    331340        if ((hash & IPC_CALLID_ANSWERED) == 0 && hash != IPCP_CALLID_SYNC) {
     
    338347       
    339348        hash = hash & ~IPC_CALLID_ANSWERED;
    340        
    341         item = hash_table_find(&pending_calls, &hash);
     349        key[0] = hash;
     350       
     351        item = hash_table_find(&pending_calls, key);
    342352        if (item == NULL)
    343353                return; /* No matching question found */
     
    347357         */
    348358       
    349         pcall = hash_table_get_inst(item, pending_call_t, link);
    350         hash_table_remove(&pending_calls, &hash);
     359        pcall = hash_table_get_instance(item, pending_call_t, link);
     360        hash_table_remove(&pending_calls, key, 1);
    351361       
    352362        parse_answer(hash, pcall, call);
Note: See TracChangeset for help on using the changeset viewer.