59 #define bhifs_node_init(n,h,b) \ 61 dlisth_init(&(n)->head); \ 66 dlisth_init(&(n)->children); \ 69 #define bhifs_node_prune(n) \ 71 dlisth_delete((dlisth *)(n)); \ 75 #define bhifs_node_prune_and_register_root(fe,n) \ 77 bhifs_node_prune(n); \ 78 dlisth_insert_after((dlisth *)(n),&(fe)->root_handles); \ 107 #define RR_LOCK() API_LOCK(&rr_mutex) 108 #define RR_UNLOCK() API_UNLOCK(&rr_mutex) 109 #define MAX_NUM_ROOTS 1024 115 #define BH_RID_BITS 16 116 #define BH_RID_OFFSET 48 117 #define BH_RID_MASK 0xffff000000000000ULL 118 #define BH_RID_FILTER(h) (0xffffULL & (h)) 120 #define BH_ID_BITS 48 121 #define BH_ID_OFFSET 0 122 #define BH_ID_MASK 0x0000ffffffffffffULL 123 #define BH_ID_FILTER(h) (0xffffffffffffULL & (h)) 125 #define BH_MAKE(rr_,id_) \ 126 (((BH_RID_FILTER(rr_)<< BH_RID_OFFSET) & BH_RID_MASK) | \ 127 ((BH_ID_FILTER(id_)<<BH_ID_OFFSET) & BH_ID_MASK)) 129 #define BH_GET_RID(h) \ 130 BH_RID_FILTER(((h)&BH_RID_MASK)>>BH_RID_OFFSET) 132 #define BH_SET_RID(h,r) \ 133 h = (((r)<<BH_RID_OFFSET)&BH_RID_MASK) | ((h) & ~BH_RID_MASK) 135 #define BH_GET_ID(h) \ 136 BH_ID_FILTER(((h)&BH_ID_MASK)>>BH_ID_OFFSET) 138 #define BH_SET_ID(h,r) \ 139 h = (((r)<<BH_ID_OFFSET)&BH_ID_MASK) | ((h) & ~BH_ID_MASK) 164 static int sh_hashf (
void *key,
unsigned int *
rv);
165 static int sh_keyf (
void *elem,
void **rk);
265 *rrid = rr_alloc_count++;
266 *root = &Roots[*
rrid];
283 *root = &Roots[
rrid];
445 parent_node = node->
parent;
447 *pbind = parent_node->
bind;
501 node->
parent = parent_node;
530 *pchild = child->
bind;
559 *psibling = sibling->
bind;
655 *rc = (p1 == p2) ? 0 : p1 < p2 ? -1 : 1;
674 *rv = (
unsigned int) (*p % UINT_MAX);
933 *bhifs = root->
bhifs;
int bh_root_unlock(int rrid)
#define dlisth_insert_before(ih, bh)
#define dlisth_insert_after(ih, bh)
#define ER_INTERFACE_HANDLE_TIMEOUT
int(* bind_get_first_child)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **pchild)
void(* destroy)(BH_INTERFACE *ifs)
int hash_insert(hash_table *ht, void *elem)
static int sh_keyf(void *elem, void **rk)
static int rr_alloc_count
int bh_root_release(int rrid)
static int rr_next_handle(bh_provider *bh, BIND_HANDLE *rv)
#define BH_MAKE(rr_, id_)
int(* bind_graft)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND *on_bind)
void hash_destroy(hash_table *ht, ht_destroyf dtor)
static int fe_bind_map_worker(bh_context_fe *fe, BHIFS_NODE *node, bh_mapf mf, void *arg)
static int rr_initialized
int hash_lookup(hash_table *ht, void *key, void **relem)
int(* lookup)(BH_INTERFACE *ifs, BIND_HANDLE bh, BH_BIND **bind)
int bh_root_lock(int rrid, BH_INTERFACE **bhifs)
#define ER_INTERFACE_NOT_SUPPORTED_OPERATION
int hash_delete(hash_table *ht, void *key, void **relem)
static API_MUTEX rr_mutex
static int fe_alloc_handle(BH_INTERFACE *bhifs, BH_BIND *bind, BIND_HANDLE *bh)
int(* bh_mapf)(BH_INTERFACE *ifs, BH_BIND *bind, void *arg)
int bh_root_acquire(int *rrid, BH_ROOT_TYPE rt)
static int fe_destroy_handle_worker(bh_context_fe *fe, BHIFS_NODE *node)
#define ER_INTERFACE_TOO_MANY_CONNECTION
int(* bind_get_next_sibling)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **psibling)
static int bri_init_root(void)
bh_provider * handle_provider
static int be_create_static_hash(bh_context_be **be, int bucket_sz)
static int fe_destroy_handle(BH_INTERFACE *bhifs, BIND_HANDLE bh)
#define bhifs_node_prune_and_register_root(fe, n)
#define bhifs_node_prune(n)
#define ER_INTERFACE_GENERIC
static int rr_lazy_init(void)
static int sh_delete(bh_context_be *be, BIND_HANDLE handle, BHIFS_NODE **node)
#define bhifs_node_init(n, h, b)
void(* destroy)(bh_context_be *be)
int(* bind_to_handle)(BH_INTERFACE *ifs, BH_BIND *bind, BIND_HANDLE *bh)
static BH_ROOT Roots[MAX_NUM_ROOTS]
static int fe_lookup(BH_INTERFACE *bhifs, BIND_HANDLE bh, BH_BIND **bind)
static int fe_bind_get_parent(BH_INTERFACE *bhifs, BH_BIND *bind, BH_BIND **pbind)
int create_handle_context(bh_provider *prov, BH_ROOT_TYPE rt, BH_INTERFACE **bhifs)
static int fe_bind_get_next_sibling(BH_INTERFACE *bhifs, BH_BIND *bind, BH_BIND **psibling)
int(* bind_get_parent)(BH_INTERFACE *ifs, BH_BIND *bind, BH_BIND **pbind)
static int sh_comparef(void *key1, void *key2, int *rc)
int(* insert)(bh_context_be *be, BHIFS_NODE *const node)
static int sh_insert(bh_context_be *be, BHIFS_NODE *const node)
static int bri_alloc_root(int *rrid, BH_ROOT **root)
static int fe_bind_get_first_child(BH_INTERFACE *bhifs, BH_BIND *bind, BH_BIND **pchild)
static int sh_hashf(void *key, unsigned int *rv)
int(* bind_prune)(BH_INTERFACE *ifs, BH_BIND *bind)
static int fe_bind_to_handle(BH_INTERFACE *bhifs, BH_BIND *bind, BIND_HANDLE *bh)
static void sh_destroy(bh_context_be *be)
int(* delete)(bh_context_be *be, BIND_HANDLE handle, BHIFS_NODE **node)
static int sh_lookup(bh_context_be *be, BIND_HANDLE handle, BHIFS_NODE **node)
int(* next_handle)(bh_provider *p, BIND_HANDLE *rv)
int bh_get_rid(BIND_HANDLE bh, int *rid)
static int fe_bind_prune(BH_INTERFACE *bhifs, BH_BIND *bind)
static BH_ROOT * rr_free_list
static int fe_bind_map(BH_INTERFACE *bhifs, BH_BIND *bind, bh_mapf mf, void *arg)
#define dlisth_is_empty(h)
int(* destroy_handle)(BH_INTERFACE *ifs, BIND_HANDLE bh)
int(* alloc_handle)(BH_INTERFACE *ifs, BH_BIND *bind, BIND_HANDLE *bh)
#define API_MUTEX_INIT(m)
#define API_MUTEX_INITIALIZER
static int fe_bind_graft(BH_INTERFACE *bhifs, BH_BIND *bind, BH_BIND *pbind)
static void rr_init_root(BH_ROOT *root, int i)
#define ER_INTERFACE_INVALID_ARGUMENT
#define ER_INTERFACE_INVALID_HANDLE
int(* bind_map)(BH_INTERFACE *ifs, BH_BIND *bind, bh_mapf mf, void *arg)
int(* lookup)(bh_context_be *be, BIND_HANDLE handle, BHIFS_NODE **node)
static int bri_access_root(int rrid, BH_ROOT **root)
int hash_new(int bucket_sz, ht_hashf hashf, ht_keyf keyf, ht_comparef comparef, hash_table **rht)
#define ER_INTERFACE_NO_MORE_MEMORY
static void fe_destroy(BH_INTERFACE *bhifs)