Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/locfs/locfs_ops.c

    r3e6a98c5 r086290d  
    3737
    3838#include <macros.h>
    39 #include <stdbool.h>
     39#include <bool.h>
    4040#include <errno.h>
    4141#include <malloc.h>
     
    6161        async_sess_t *sess;       /**< If NULL, the structure is incomplete. */
    6262        size_t refcount;
    63         ht_link_t link;
     63        link_t link;
    6464        fibril_condvar_t cv;      /**< Broadcast when completed. */
    6565} service_t;
     
    7171static FIBRIL_MUTEX_INITIALIZE(services_mutex);
    7272
     73#define SERVICES_KEYS        1
     74#define SERVICES_KEY_HANDLE  0
     75#define SERVICES_BUCKETS     256
     76
    7377/* Implementation of hash table interface for the nodes hash table. */
    74 
    75 static size_t services_key_hash(void *key)
    76 {
    77         return *(service_id_t*)key;
    78 }
    79 
    80 static size_t services_hash(const ht_link_t *item)
    81 {
    82         service_t *dev = hash_table_get_inst(item, service_t, link);
    83         return dev->service_id;
    84 }
    85 
    86 static bool services_key_equal(void *key, const ht_link_t *item)
    87 {
    88         service_t *dev = hash_table_get_inst(item, service_t, link);
    89         return (dev->service_id == *(service_id_t*)key);
    90 }
    91 
    92 static void services_remove_callback(ht_link_t *item)
    93 {
    94         free(hash_table_get_inst(item, service_t, link));
    95 }
    96 
    97 static hash_table_ops_t services_ops = {
     78static hash_index_t services_hash(unsigned long key[])
     79{
     80        return key[SERVICES_KEY_HANDLE] % SERVICES_BUCKETS;
     81}
     82
     83static int services_compare(unsigned long key[], hash_count_t keys, link_t *item)
     84{
     85        service_t *dev = hash_table_get_instance(item, service_t, link);
     86        return (dev->service_id == (service_id_t) key[SERVICES_KEY_HANDLE]);
     87}
     88
     89static void services_remove_callback(link_t *item)
     90{
     91        free(hash_table_get_instance(item, service_t, link));
     92}
     93
     94static hash_table_operations_t services_ops = {
    9895        .hash = services_hash,
    99         .key_hash = services_key_hash,
    100         .key_equal = services_key_equal,
    101         .equal = NULL,
     96        .compare = services_compare,
    10297        .remove_callback = services_remove_callback
    10398};
     
    234229                /* Device node */
    235230               
     231                unsigned long key[] = {
     232                        [SERVICES_KEY_HANDLE] = (unsigned long) node->service_id
     233                };
     234                link_t *lnk;
     235               
    236236                fibril_mutex_lock(&services_mutex);
    237                 ht_link_t *lnk;
    238237restart:
    239                 lnk = hash_table_find(&services, &node->service_id);
     238                lnk = hash_table_find(&services, key);
    240239                if (lnk == NULL) {
    241240                        service_t *dev = (service_t *) malloc(sizeof(service_t));
     
    257256                         * below.
    258257                         */
    259                         hash_table_insert(&services, &dev->link);
     258                        hash_table_insert(&services, key, &dev->link);
    260259                       
    261260                        /*
     
    280279                                 * entry and free the device structure.
    281280                                 */
    282                                 hash_table_remove(&services, &node->service_id);
     281                                hash_table_remove(&services, key, SERVICES_KEYS);
    283282                                fibril_mutex_unlock(&services_mutex);
    284283                               
     
    289288                        dev->sess = sess;
    290289                } else {
    291                         service_t *dev = hash_table_get_inst(lnk, service_t, link);
     290                        service_t *dev = hash_table_get_instance(lnk, service_t, link);
    292291                       
    293292                        if (!dev->sess) {
     
    451450bool locfs_init(void)
    452451{
    453         if (!hash_table_create(&services, 0,  0, &services_ops))
     452        if (!hash_table_create(&services, SERVICES_BUCKETS,
     453            SERVICES_KEYS, &services_ops))
    454454                return false;
    455455       
     
    555555                /* Device node */
    556556               
     557                unsigned long key[] = {
     558                        [SERVICES_KEY_HANDLE] = (unsigned long) index
     559                };
     560               
    557561                fibril_mutex_lock(&services_mutex);
    558                 service_id_t service_index = index;
    559                 ht_link_t *lnk = hash_table_find(&services, &service_index);
     562                link_t *lnk = hash_table_find(&services, key);
    560563                if (lnk == NULL) {
    561564                        fibril_mutex_unlock(&services_mutex);
     
    563566                }
    564567               
    565                 service_t *dev = hash_table_get_inst(lnk, service_t, link);
     568                service_t *dev = hash_table_get_instance(lnk, service_t, link);
    566569                assert(dev->sess);
    567570               
     
    618621        if (type == LOC_OBJECT_SERVICE) {
    619622                /* Device node */
     623                unsigned long key[] = {
     624                        [SERVICES_KEY_HANDLE] = (unsigned long) index
     625                };
    620626               
    621627                fibril_mutex_lock(&services_mutex);
    622                 service_id_t service_index = index;
    623                 ht_link_t *lnk = hash_table_find(&services, &service_index);
     628                link_t *lnk = hash_table_find(&services, key);
    624629                if (lnk == NULL) {
    625630                        fibril_mutex_unlock(&services_mutex);
     
    627632                }
    628633               
    629                 service_t *dev = hash_table_get_inst(lnk, service_t, link);
     634                service_t *dev = hash_table_get_instance(lnk, service_t, link);
    630635                assert(dev->sess);
    631636               
     
    686691       
    687692        if (type == LOC_OBJECT_SERVICE) {
     693                unsigned long key[] = {
     694                        [SERVICES_KEY_HANDLE] = (unsigned long) index
     695                };
    688696               
    689697                fibril_mutex_lock(&services_mutex);
    690                 service_id_t service_index = index;
    691                 ht_link_t *lnk = hash_table_find(&services, &service_index);
     698                link_t *lnk = hash_table_find(&services, key);
    692699                if (lnk == NULL) {
    693700                        fibril_mutex_unlock(&services_mutex);
     
    695702                }
    696703               
    697                 service_t *dev = hash_table_get_inst(lnk, service_t, link);
     704                service_t *dev = hash_table_get_instance(lnk, service_t, link);
    698705                assert(dev->sess);
    699706                dev->refcount--;
     
    701708                if (dev->refcount == 0) {
    702709                        async_hangup(dev->sess);
    703                         service_id_t service_index = index;
    704                         hash_table_remove(&services, &service_index);
     710                        hash_table_remove(&services, key, SERVICES_KEYS);
    705711                }
    706712               
     
    726732       
    727733        if (type == LOC_OBJECT_SERVICE) {
    728 
     734                unsigned long key[] = {
     735                        [SERVICES_KEY_HANDLE] = (unsigned long) index
     736                };
     737               
    729738                fibril_mutex_lock(&services_mutex);
    730                 service_id_t service_index = index;
    731                 ht_link_t *lnk = hash_table_find(&services, &service_index);
     739                link_t *lnk = hash_table_find(&services, key);
    732740                if (lnk == NULL) {
    733741                        fibril_mutex_unlock(&services_mutex);
     
    735743                }
    736744               
    737                 service_t *dev = hash_table_get_inst(lnk, service_t, link);
     745                service_t *dev = hash_table_get_instance(lnk, service_t, link);
    738746                assert(dev->sess);
    739747               
Note: See TracChangeset for help on using the changeset viewer.