29 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_CLIENT 65 static bool rm_key_eq(
const void *key1,
const void *key2)
94 rm_ctx_hbucket_lock(&
m0c->m0c_rm_ctxs, &
fid);
95 ctx = rm_ctx_htable_lookup(&
m0c->m0c_rm_ctxs, &
fid);
101 rm_ctx_hbucket_unlock(&
m0c->m0c_rm_ctxs, &
fid);
102 return M0_RC(-ENOMEM);
105 rm_ctx_htable_add(&
m0c->m0c_rm_ctxs,
ctx);
108 rm_ctx_hbucket_unlock(&
m0c->m0c_rm_ctxs, &
fid);
127 ctx->rmc_htable = &
m0c->m0c_rm_ctxs;
130 rm_ctx_tlink_init(
ctx);
139 &
ctx->rmc_rw_file, &
ctx->rmc_creditor);
154 rm_ctx_hbucket_lock(
ctx->rmc_htable, &
ctx->rmc_key);
156 rm_ctx_htable_del(
ctx->rmc_htable,
ctx);
157 rm_ctx_hbucket_unlock(
ctx->rmc_htable, &
ctx->rmc_key);
161 rm_ctx_hbucket_unlock(
ctx->rmc_htable, &
ctx->rmc_key);
185 rm_ctx_tlink_fini(
ctx);
326 #undef M0_TRACE_SUBSYSTEM M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
M0_INTERNAL void m0_fid_gob_make(struct m0_fid *gob_fid, uint32_t container, uint64_t key)
M0_INTERNAL void m0_chan_broadcast_lock(struct m0_chan *chan)
void m0_obj_lock_put(struct m0_rm_lock_req *req)
M0_INTERNAL uint64_t m0_fid_hash(const struct m0_fid *fid)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
void(* rio_complete)(struct m0_rm_incoming *in, int32_t rc)
const m0_time_t M0_TIME_NEVER
static struct io_request req
int m0_obj_read_lock_get(struct m0_obj *obj, struct m0_rm_lock_req *req, struct m0_clink *clink)
#define M0_LOG(level,...)
static void rm_ctx_init(struct m0_rm_lock_ctx *ctx, struct m0_client *m0c, struct m0_fid *fid)
int m0_obj_write_lock_get_sync(struct m0_obj *obj, struct m0_rm_lock_req *req)
static void obj_lock_incoming_complete(struct m0_rm_incoming *in, int32_t rc)
M0_INTERNAL void m0_rm_rwlock_req_init(struct m0_rm_incoming *req, struct m0_rm_owner *owner, const struct m0_rm_incoming_ops *ops, enum m0_rm_incoming_flags flags, enum m0_rm_rwlock_req_type type)
int m0_obj_lock_init(struct m0_obj *obj)
int m0_obj_write_lock_get(struct m0_obj *obj, struct m0_rm_lock_req *req, struct m0_clink *clink)
static struct m0_clovis * m0c
M0_INTERNAL void m0_rm_remote_init(struct m0_rm_remote *rem, struct m0_rm_resource *res)
void m0_obj_lock_fini(struct m0_obj *obj)
M0_INTERNAL void m0_rw_lockable_fini(struct m0_rw_lockable *lockable)
M0_INTERNAL int m0_rm_owner_timedwait(struct m0_rm_owner *owner, uint64_t state, const m0_time_t abs_timeout)
static struct m0_pools_common pc
M0_INTERNAL void m0_rm_rwlock_owner_init(struct m0_rm_owner *owner, struct m0_fid *fid, struct m0_rw_lockable *lockable, struct m0_rm_remote *creditor)
static void rm_ctx_fini(struct m0_ref *ref)
static void rm_lock_req_fini(struct m0_rm_lock_req *req)
struct m0_rm_incoming rlr_in
M0_INTERNAL void m0_ref_put(struct m0_ref *ref)
void m0_ref_init(struct m0_ref *ref, int init_num, void(*release)(struct m0_ref *ref))
int m0_obj_read_lock_get_sync(struct m0_obj *obj, struct m0_rm_lock_req *req)
M0_INTERNAL void m0_ref_get(struct m0_ref *ref)
M0_INTERNAL void m0_rm_rwlock_owner_fini(struct m0_rm_owner *owner)
#define M0_AMB(obj, ptr, field)
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
M0_INTERNAL void m0_fid_tgenerate(struct m0_fid *fid, const uint8_t tid)
M0_INTERNAL void m0_rw_lockable_init(struct m0_rw_lockable *lockable, const struct m0_fid *fid, struct m0_rm_domain *dom)
static void obj_lock_incoming_conflict(struct m0_rm_incoming *in)
M0_HT_DESCR_DEFINE(rm_ctx, "Hash-table for RM locks", M0_INTERNAL, struct m0_rm_lock_ctx, rmc_hlink, rmc_magic, M0_RM_MAGIC, M0_RM_HEAD_MAGIC, rmc_key, rm_hash_func, rm_key_eq)
M0_INTERNAL struct m0_rm_domain * rm_domain_get(struct m0_client *cinst)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
#define m0_cookie_of(cookie, type, field)
M0_INTERNAL void m0_cookie_init(struct m0_cookie *cookie, const uint64_t *obj)
static bool rm_key_eq(const void *key1, const void *key2)
static struct m0_clink clink[RDWR_REQUEST_MAX]
const struct m0_rm_incoming_ops obj_lock_incoming_ops
static struct fdmi_ctx ctx
M0_INTERNAL int m0_obj_lock_get_sync(struct m0_obj *obj, struct m0_rm_lock_req *req, enum m0_rm_rwlock_req_type rw_type)
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
M0_INTERNAL void m0_rm_credit_put(struct m0_rm_incoming *in)
M0_INTERNAL int64_t m0_ref_read(const struct m0_ref *ref)
M0_INTERNAL void m0_rm_remote_fini(struct m0_rm_remote *rem)
#define M0_ALLOC_PTR(ptr)
M0_HT_DEFINE(rm_ctx, M0_INTERNAL, struct m0_rm_lock_ctx, struct m0_fid)
M0_INTERNAL void m0_rm_owner_windup(struct m0_rm_owner *owner)
M0_INTERNAL void m0_cookie_new(uint64_t *gen)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
static uint64_t rm_hash_func(const struct m0_htable *htable, const void *k)
M0_INTERNAL int m0_obj_lock_get(struct m0_obj *obj, struct m0_rm_lock_req *req, struct m0_clink *clink, enum m0_rm_rwlock_req_type rw_type)
M0_INTERNAL void m0_rm_incoming_fini(struct m0_rm_incoming *in)
M0_INTERNAL struct m0_rpc_session * m0_pools_common_active_rm_session(struct m0_pools_common *pc)
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
static void rm_lock_req_init(struct m0_clink *clink, struct m0_rm_owner *owner, struct m0_rm_lock_req *req, enum m0_rm_rwlock_req_type rw_type)
M0_INTERNAL void m0_rm_credit_get(struct m0_rm_incoming *in)