#ifndef _RPC_TAGS_H
#define _RPC_TAGS_H
#ifdef __cplusplus
extern "C" {
#endif
typedef char tagid[16];
#define RPC_TAG_HOLD_LOCKED(tag) { \
ASSERT(mutex_owned(&(tag)->rt_lock)); \
(tag)->rt_ref++; \
DTRACE_PROBE1(rpc__tag__hold, rpc_tag_t *, tag); \
}
#define RPC_TAG_HOLD(tag) { \
rpc_tag_hold(tag); \
}
#define RPC_TAG_RELE_LOCKED(tag) { \
rpc_tag_rele_nolock(tag); \
}
#define RPC_TAG_RELE(tag) { \
rpc_tag_rele(tag); \
}
#define RPC_TAG_CMP(tag1, tag2) (bcmp(tag1, tag2, sizeof (tagid)))
#define XPRT2TLST(xprt, offset) \
((rpc_xprt_taglist_t **)(((char *)xprt) + offset))
typedef struct rpc_tag_hd {
list_t rth_list;
kmutex_t rth_lock;
size_t rth_xpoff;
} rpc_tag_hd_t;
typedef struct rpc_tag {
tagid rt_id;
kmutex_t rt_lock;
int rt_flags;
uint64_t rt_ref;
kcondvar_t rt_cv;
list_node_t rt_next;
list_t rt_xplist;
} rpc_tag_t;
#define RPC_TAG_DESTROY 0x01
typedef struct rpc_tag_xprt {
list_node_t rtx_xprt_next;
void *rtx_xprt;
} rpc_tag_xprt_t;
typedef struct rpc_xprt_taglist {
int rxtl_flags;
kcondvar_t rxtl_cv;
kmutex_t rxtl_lock;
list_t rxtl_list;
} rpc_xprt_taglist_t;
#define RPC_XP_TGL_DESTROY 0x01
typedef struct rpc_xprt_tag {
list_node_t rxt_next;
rpc_tag_t *rxt_tag;
} rpc_xprt_tag_t;
extern void rpc_taghd_init(rpc_tag_hd_t *, offset_t);
extern void rpc_taghd_destroy(rpc_tag_hd_t *);
extern void rpc_add_tag(rpc_tag_hd_t *, void *, void *);
extern rpc_tag_t *rpc_lookup_tag(rpc_tag_hd_t *, void *, int);
extern void rpc_tag_hold(rpc_tag_t *);
extern void rpc_tag_rele(rpc_tag_t *);
extern void rpc_tag_rele_nolock(rpc_tag_t *);
extern int rpc_tag_swap(rpc_tag_hd_t *, void *, void *);
extern void rpc_destroy_tag(rpc_tag_hd_t *, void *);
extern void rpc_init_taglist(void **);
extern void rpc_destroy_taglist(void **);
extern int rpc_is_taglist_empty(void *);
extern int rpc_cmp_tag(void *, void *);
extern void rpc_remove_tag(rpc_tag_hd_t *, void *, void *);
extern void rpc_remove_all_tag(rpc_tag_hd_t *, void *);
extern void rpc_remove_xprt(rpc_tag_hd_t *, rpc_tag_t *, void *);
extern void rpc_remove_all_xprt(rpc_tag_hd_t *, rpc_tag_t *);
extern void * rpc_get_next_xprt(rpc_tag_t *, void **);
#ifdef __cplusplus
}
#endif
#endif