1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2014 Joyent, Inc.  All rights reserved.
  14  */
  15 
  16 #ifndef _SYS_SCSI_ADAPTERS_MPTHASH_H
  17 #define _SYS_SCSI_ADAPTERS_MPTHASH_H
  18 
  19 #include <sys/types.h>
  20 #include <sys/list.h>
  21 
  22 #define RHL_F_DEAD      0x01
  23 
  24 typedef struct refhash_link {
  25         list_node_t rhl_chain_link;
  26         list_node_t rhl_global_link;
  27         uint_t rhl_flags;
  28         uint_t rhl_refcnt;
  29 } refhash_link_t;
  30 
  31 typedef uint64_t (*refhash_hash_f)(const void *);
  32 typedef int (*refhash_cmp_f)(const void *, const void *);
  33 typedef void (*refhash_dtor_f)(void *);
  34 typedef int (*refhash_eval_f)(const void *, void *);
  35 
  36 typedef struct refhash {
  37         list_t *rh_buckets;
  38         uint_t rh_bucket_count;
  39         list_t rh_objs;
  40         size_t rh_obj_size;     /* used by mdb */
  41         size_t rh_link_off;
  42         size_t rh_tag_off;
  43         refhash_hash_f rh_hash;
  44         refhash_cmp_f rh_cmp;
  45         refhash_dtor_f rh_dtor;
  46 } refhash_t;
  47 
  48 extern refhash_t *refhash_create(uint_t, refhash_hash_f, refhash_cmp_f,
  49     refhash_dtor_f, size_t, size_t, size_t, int);
  50 extern void refhash_destroy(refhash_t *);
  51 extern void refhash_insert(refhash_t *, void *);
  52 extern void refhash_remove(refhash_t *, void *);
  53 extern void *refhash_lookup(refhash_t *, const void *);
  54 extern void *refhash_linear_search(refhash_t *, refhash_eval_f, void *);
  55 extern void refhash_hold(refhash_t *, void *);
  56 extern void refhash_rele(refhash_t *, void *);
  57 extern void *refhash_first(refhash_t *);
  58 extern void *refhash_next(refhash_t *, void *);
  59 extern boolean_t refhash_obj_valid(refhash_t *hp, const void *);
  60 
  61 #endif  /* _SYS_SCSI_ADAPTERS_MPTHASH_H */