Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/devman.c

    rbc216a0 r9d58539  
    6666/* hash table operations */
    6767
    68 static inline size_t handle_key_hash(void *key)
    69 {
    70         devman_handle_t handle = *(devman_handle_t*)key;
    71         return handle;
    72 }
    73 
    74 static size_t devman_devices_hash(const ht_link_t *item)
    75 {
    76         dev_node_t *dev = hash_table_get_inst(item, dev_node_t, devman_dev);
    77         return handle_key_hash(&dev->handle);
    78 }
    79 
    80 static size_t devman_functions_hash(const ht_link_t *item)
    81 {
    82         fun_node_t *fun = hash_table_get_inst(item, fun_node_t, devman_fun);
    83         return handle_key_hash(&fun->handle);
    84 }
    85 
    86 static bool devman_devices_key_equal(void *key, const ht_link_t *item)
    87 {
    88         devman_handle_t handle = *(devman_handle_t*)key;
    89         dev_node_t *dev = hash_table_get_inst(item, dev_node_t, devman_dev);
    90         return dev->handle == handle;
    91 }
    92 
    93 static bool devman_functions_key_equal(void *key, const ht_link_t *item)
    94 {
    95         devman_handle_t handle = *(devman_handle_t*)key;
    96         fun_node_t *fun = hash_table_get_inst(item, fun_node_t, devman_fun);
    97         return fun->handle == handle;
    98 }
    99 
    100 static inline size_t service_id_key_hash(void *key)
    101 {
    102         service_id_t service_id = *(service_id_t*)key;
    103         return service_id;
    104 }
    105 
    106 static size_t loc_functions_hash(const ht_link_t *item)
    107 {
    108         fun_node_t *fun = hash_table_get_inst(item, fun_node_t, loc_fun);
    109         return service_id_key_hash(&fun->service_id);
    110 }
    111 
    112 static bool loc_functions_key_equal(void *key, const ht_link_t *item)
    113 {
    114         service_id_t service_id = *(service_id_t*)key;
    115         fun_node_t *fun = hash_table_get_inst(item, fun_node_t, loc_fun);
    116         return fun->service_id == service_id;
    117 }
    118 
    119 
    120 static hash_table_ops_t devman_devices_ops = {
    121         .hash = devman_devices_hash,
    122         .key_hash = handle_key_hash,
    123         .key_equal = devman_devices_key_equal,
    124         .equal = 0,
    125         .remove_callback = 0
     68static hash_index_t devices_hash(unsigned long key[])
     69{
     70        return key[0] % DEVICE_BUCKETS;
     71}
     72
     73static int devman_devices_compare(unsigned long key[], hash_count_t keys,
     74    link_t *item)
     75{
     76        dev_node_t *dev = hash_table_get_instance(item, dev_node_t, devman_dev);
     77        return (dev->handle == (devman_handle_t) key[0]);
     78}
     79
     80static int devman_functions_compare(unsigned long key[], hash_count_t keys,
     81    link_t *item)
     82{
     83        fun_node_t *fun = hash_table_get_instance(item, fun_node_t, devman_fun);
     84        return (fun->handle == (devman_handle_t) key[0]);
     85}
     86
     87static int loc_functions_compare(unsigned long key[], hash_count_t keys,
     88    link_t *item)
     89{
     90        fun_node_t *fun = hash_table_get_instance(item, fun_node_t, loc_fun);
     91        return (fun->service_id == (service_id_t) key[0]);
     92}
     93
     94static void devices_remove_callback(link_t *item)
     95{
     96}
     97
     98static hash_table_operations_t devman_devices_ops = {
     99        .hash = devices_hash,
     100        .compare = devman_devices_compare,
     101        .remove_callback = devices_remove_callback
    126102};
    127103
    128 static hash_table_ops_t devman_functions_ops = {
    129         .hash = devman_functions_hash,
    130         .key_hash = handle_key_hash,
    131         .key_equal = devman_functions_key_equal,
    132         .equal = 0,
    133         .remove_callback = 0
     104static hash_table_operations_t devman_functions_ops = {
     105        .hash = devices_hash,
     106        .compare = devman_functions_compare,
     107        .remove_callback = devices_remove_callback
    134108};
    135109
    136 static hash_table_ops_t loc_devices_ops = {
    137         .hash = loc_functions_hash,
    138         .key_hash = service_id_key_hash,
    139         .key_equal = loc_functions_key_equal,
    140         .equal = 0,
    141         .remove_callback = 0
     110static hash_table_operations_t loc_devices_ops = {
     111        .hash = devices_hash,
     112        .compare = loc_functions_compare,
     113        .remove_callback = devices_remove_callback
    142114};
    143115
     
    1002974        tree->current_handle = 0;
    1003975       
    1004         hash_table_create(&tree->devman_devices, 0, 0, &devman_devices_ops);
    1005         hash_table_create(&tree->devman_functions, 0, 0, &devman_functions_ops);
    1006         hash_table_create(&tree->loc_functions, 0, 0, &loc_devices_ops);
     976        hash_table_create(&tree->devman_devices, DEVICE_BUCKETS, 1,
     977            &devman_devices_ops);
     978        hash_table_create(&tree->devman_functions, DEVICE_BUCKETS, 1,
     979            &devman_functions_ops);
     980        hash_table_create(&tree->loc_functions, DEVICE_BUCKETS, 1,
     981            &loc_devices_ops);
    1007982       
    1008983        fibril_rwlock_initialize(&tree->rwlock);
     
    10381013        list_initialize(&dev->functions);
    10391014        link_initialize(&dev->driver_devices);
     1015        link_initialize(&dev->devman_dev);
    10401016       
    10411017        return dev;
     
    10851061dev_node_t *find_dev_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
    10861062{
     1063        unsigned long key = handle;
     1064        link_t *link;
     1065       
    10871066        assert(fibril_rwlock_is_locked(&tree->rwlock));
    10881067       
    1089         ht_link_t *link = hash_table_find(&tree->devman_devices, &handle);
     1068        link = hash_table_find(&tree->devman_devices, &key);
    10901069        if (link == NULL)
    10911070                return NULL;
    10921071       
    1093         return hash_table_get_inst(link, dev_node_t, devman_dev);
     1072        return hash_table_get_instance(link, dev_node_t, devman_dev);
    10941073}
    10951074
     
    11651144        link_initialize(&fun->dev_functions);
    11661145        list_initialize(&fun->match_ids.ids);
     1146        link_initialize(&fun->devman_fun);
     1147        link_initialize(&fun->loc_fun);
    11671148       
    11681149        return fun;
     
    12131194fun_node_t *find_fun_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
    12141195{
     1196        unsigned long key = handle;
     1197        link_t *link;
    12151198        fun_node_t *fun;
    12161199       
    12171200        assert(fibril_rwlock_is_locked(&tree->rwlock));
    12181201       
    1219         ht_link_t *link = hash_table_find(&tree->devman_functions, &handle);
     1202        link = hash_table_find(&tree->devman_functions, &key);
    12201203        if (link == NULL)
    12211204                return NULL;
    12221205       
    1223         fun = hash_table_get_inst(link, fun_node_t, devman_fun);
     1206        fun = hash_table_get_instance(link, fun_node_t, devman_fun);
    12241207       
    12251208        return fun;
     
    12991282        /* Add the node to the handle-to-node map. */
    13001283        dev->handle = ++tree->current_handle;
    1301         hash_table_insert(&tree->devman_devices, &dev->devman_dev);
     1284        unsigned long key = dev->handle;
     1285        hash_table_insert(&tree->devman_devices, &key, &dev->devman_dev);
    13021286
    13031287        /* Add the node to the list of its parent's children. */
     
    13201304       
    13211305        /* Remove node from the handle-to-node map. */
    1322         hash_table_remove(&tree->devman_devices, &dev->handle);
     1306        unsigned long key = dev->handle;
     1307        hash_table_remove(&tree->devman_devices, &key, 1);
    13231308       
    13241309        /* Unlink from parent function. */
     
    13611346        /* Add the node to the handle-to-node map. */
    13621347        fun->handle = ++tree->current_handle;
    1363         hash_table_insert(&tree->devman_functions, &fun->devman_fun);
     1348        unsigned long key = fun->handle;
     1349        hash_table_insert(&tree->devman_functions, &key, &fun->devman_fun);
    13641350
    13651351        /* Add the node to the list of its parent's children. */
     
    13811367       
    13821368        /* Remove the node from the handle-to-node map. */
    1383         hash_table_remove(&tree->devman_functions, &fun->handle);
     1369        unsigned long key = fun->handle;
     1370        hash_table_remove(&tree->devman_functions, &key, 1);
    13841371       
    13851372        /* Remove the node from the list of its parent's children. */
     
    14941481{
    14951482        fun_node_t *fun = NULL;
     1483        link_t *link;
     1484        unsigned long key = (unsigned long) service_id;
    14961485       
    14971486        fibril_rwlock_read_lock(&tree->rwlock);
    1498         ht_link_t *link = hash_table_find(&tree->loc_functions, &service_id);
     1487        link = hash_table_find(&tree->loc_functions, &key);
    14991488        if (link != NULL) {
    1500                 fun = hash_table_get_inst(link, fun_node_t, loc_fun);
     1489                fun = hash_table_get_instance(link, fun_node_t, loc_fun);
    15011490                fun_add_ref(fun);
    15021491        }
     
    15101499        assert(fibril_rwlock_is_write_locked(&tree->rwlock));
    15111500       
    1512         hash_table_insert(&tree->loc_functions, &fun->loc_fun);
     1501        unsigned long key = (unsigned long) fun->service_id;
     1502        hash_table_insert(&tree->loc_functions, &key, &fun->loc_fun);
    15131503}
    15141504
Note: See TracChangeset for help on using the changeset viewer.