29 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_FOP 71 m0_lll_tlink_init(link);
78 M0_PRE(!m0_lll_tlink_is_in(link));
81 m0_lll_tlink_fini(link);
115 addb2->
la_taken -
fom->fo_sm_state.sm_state_epoch : 0;
122 m0_long_lock_link_bob_check(link) &&
138 last = m0_lll_tlist_tail(&
lock->l_owners);
139 first = m0_lll_tlist_head(&
lock->l_waiters);
142 m0_long_lock_bob_check(
lock) &&
151 (m0_lll_tlist_is_empty(&
lock->l_owners) &&
152 m0_lll_tlist_is_empty(&
lock->l_waiters)) &&
155 (!m0_lll_tlist_is_empty(&
lock->l_owners) &&
160 (m0_lll_tlist_length(&
lock->l_owners) == 1)) &&
189 m0_lll_tlist_move_tail(&
lock->l_owners, link);
200 M0_PRE(!m0_lll_tlink_is_in(link));
205 got_lock = m0_lll_tlist_is_empty(&
lock->l_waiters) &&
212 fom->fo_transitions_saved =
fom->fo_transitions;
213 m0_lll_tlist_add_tail(&
lock->l_waiters, link);
226 return lock(lk, link, next_phase);
234 return lock(lk, link, next_phase);
247 bool check_ownership)
252 M0_ENTRY(
"lock=%p link=%p fom=%p check_ownership=%d",
256 if (check_ownership && !m0_lll_tlist_contains(&
lock->l_owners, link)) {
262 M0_PRE(m0_lll_tlist_contains(&
lock->l_owners, link));
265 m0_lll_tlist_del(link);
268 m0_lll_tlist_is_empty(&
lock->l_owners) ?
271 while ((
next = m0_lll_tlist_head(&
lock->l_waiters)) !=
NULL &&
292 next->lll_fom->fo_transitions_saved, (1, 0)));
327 link->lll_fom ==
fom);
341 m0_lll_tlist_head(&
lock->l_owners)->lll_fom ==
fom;
352 m0_lll_tlist_init(&
lock->l_owners);
353 m0_lll_tlist_init(&
lock->l_waiters);
357 m0_long_lock_bob_init(
lock);
364 m0_long_lock_bob_fini(
lock);
366 m0_lll_tlist_fini(&
lock->l_waiters);
367 m0_lll_tlist_fini(&
lock->l_owners);
M0_INTERNAL void m0_long_lock_fini(struct m0_long_lock *lock)
M0_INTERNAL void m0_long_lock_link_init(struct m0_long_lock_link *link, struct m0_fom *fom, struct m0_long_lock_addb2 *addb2)
M0_INTERNAL void m0_fom_wakeup(struct m0_fom *fom)
static void ll_addb2_wait_finish(struct m0_long_lock_link *link)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
static struct m0_bob_type long_lock_link_bob
M0_INTERNAL void m0_long_write_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
M0_ADDB2_ADD(M0_AVI_FS_CREATE, new_fid.f_container, new_fid.f_key, mode, rc)
static bool link_invariant(const struct m0_long_lock_link *link)
M0_BOB_DEFINE(M0_INTERNAL, &long_lock_bob, m0_long_lock)
M0_INTERNAL bool m0_long_write_lock(struct m0_long_lock *lk, struct m0_long_lock_link *link, int next_phase)
struct m0_long_lock_addb2 * lll_addb2
M0_INTERNAL bool m0_long_lock(struct m0_long_lock *lock, bool write, struct m0_long_lock_link *link, int next_phase)
static void ll_addb2_wait_start(struct m0_long_lock_link *link)
static const struct m0_bob_type long_lock_bob
M0_INTERNAL void m0_long_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
m0_time_t m0_time_now(void)
M0_INTERNAL bool m0_fom_group_is_locked(const struct m0_fom *fom)
M0_INTERNAL void m0_long_lock_link_fini(struct m0_long_lock_link *link)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
M0_TL_DEFINE(m0_lll, M0_INTERNAL, struct m0_long_lock_link)
static bool lock_invariant(const struct m0_long_lock *lock)
static void ll_addb2_reset(struct m0_long_lock_link *link)
static struct m0_clink l[NR]
M0_INTERNAL bool m0_long_is_read_locked(struct m0_long_lock *lock, const struct m0_fom *fom)
M0_INTERNAL bool m0_long_is_write_locked(struct m0_long_lock *lock, const struct m0_fom *fom)
static bool can_lock(const struct m0_long_lock *lock, const struct m0_long_lock_link *link)
M0_INTERNAL void m0_long_lock_init(struct m0_long_lock *lock)
static void ll_addb2_post(struct m0_long_lock_link *link)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_long_read_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL bool m0_long_read_lock(struct m0_long_lock *lk, struct m0_long_lock_link *link, int next_phase)
void m0_fom_phase_set(struct m0_fom *fom, int phase)
static void grant(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL void m0_fom_ll_global_init(void)
M0_TL_DESCR_DEFINE(m0_lll, "list of lock-links in longlock", M0_INTERNAL, struct m0_long_lock_link, lll_lock_linkage, lll_magix, M0_FOM_LL_LINK_MAGIC, M0_FOM_LL_LINK_MAGIC)
M0_INTERNAL void m0_bob_type_tlist_init(struct m0_bob_type *bt, const struct m0_tl_descr *td)
#define offsetof(typ, memb)
#define m0_tl_exists(name, var, head,...)
enum m0_long_lock_type lll_lock_type
static void unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link, bool check_ownership)
static struct m0_addb2_frame_header last
static bool lock(struct m0_long_lock *lock, struct m0_long_lock_link *link, int next_phase)
#define m0_tl_forall(name, var, head,...)