29 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_DTM 44 up_hi_linkage, up_magix,
49 up_op_linkage, up_magix,
79 m0_dtm_op_bob_init(
op);
81 op_tlist_init(&
op->op_ups);
90 hi_tlist_add(&up->up_hi->hi_ups, up);
141 op_tlist_fini(&
op->op_ups);
142 m0_dtm_op_bob_fini(
op);
271 m0_dtm_hi_bob_init(
hi);
274 hi_tlist_init(&
hi->hi_ups);
282 hi_tlist_fini(&
hi->hi_ups);
283 m0_dtm_hi_bob_fini(
hi);
294 m0_dtm_up_bob_init(up);
295 op_tlink_init_at(up, &
op->op_ups);
309 if (hi_tlink_is_in(up))
310 hi_tlink_del_fini(up);
311 op_tlink_del_fini(up);
312 m0_dtm_up_bob_fini(up);
321 hi_tlist_add_before(
scan, up);
325 hi_tlist_add_tail(&
hi->hi_ups, up);
333 if (hi_tlink_is_in(up))
334 hi_tlink_del_fini(up);
353 return M0_3WAY(uver, hver + 1);
387 return hi_tlist_head(&
hi->hi_ups);
392 return hi_tlist_tail(&
hi->hi_ups);
399 if (up->up_ver <= ver)
440 _0C(m0_dtm_hi_bob_check(
hi)) &&
451 _0C(m0_dtm_up_bob_check(up)) &&
474 _0C(m0_dtm_op_bob_check(
op)) &&
477 _0C(up->up_hi->hi_nu ==
op->op_nu) &&
487 op_tlist_is_empty(&
op->op_ups) ||
566 (
unsigned long)
hi->hi_ver);
572 #undef M0_TRACE_SUBSYSTEM M0_INTERNAL void m0_dtm_op_init(struct m0_dtm_op *op, struct m0_dtm_nu *nu)
static void up_ready(struct m0_dtm_up *up)
M0_INTERNAL struct m0_dtm_up * m0_dtm_up_later(struct m0_dtm_up *up)
static const struct m0_dtm_op_ops op_ops
enum m0_dtm_state up_state
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
M0_INTERNAL m0_dtm_ver_t up_ver(const struct m0_dtm_up *up)
M0_INTERNAL void m0_dtm_op_done(const struct m0_dtm_op *op)
static const struct m0_bob_type op_bob
M0_INTERNAL bool m0_dtm_hi_invariant(const struct m0_dtm_hi *hi)
static int prepare(struct m0_fom *fom)
#define M0_LOG(level,...)
M0_TL_DEFINE(hi, M0_INTERNAL, struct m0_dtm_up)
M0_INTERNAL bool m0_dtm_up_invariant(const struct m0_dtm_up *up)
M0_INTERNAL void m0_dtm_nuclei_init(void)
static void up_del(struct m0_dtm_up *up)
M0_INTERNAL void up_prepared(struct m0_dtm_up *up)
M0_INTERNAL struct m0_dtm_up * hi_find(struct m0_dtm_hi *hi, m0_dtm_ver_t ver)
static void up_insert(struct m0_dtm_up *up)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
static bool op_is_locked(const struct m0_dtm_op *op)
M0_INTERNAL void m0_dtm_op_del(struct m0_dtm_op *op)
static struct m0_bob_type up_bob
M0_INTERNAL void up_print(const struct m0_dtm_up *up)
static void advance_hi(struct m0_dtm_hi *hi)
M0_INTERNAL void m0_dtm_nu_init(struct m0_dtm_nu *nu)
static int op_cmp(const struct m0_dtm_op *op)
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
M0_INTERNAL void op_print(const struct m0_dtm_op *op)
M0_INTERNAL bool m0_dtm_op_invariant(const struct m0_dtm_op *op)
static long long max(long long a, long long b)
void(* doo_miser)(struct m0_dtm_op *op)
static bool up_pair_invariant(const struct m0_dtm_up *up, const struct m0_dtm_up *next)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
M0_INTERNAL void m0_dtm_hi_fini(struct m0_dtm_hi *hi)
M0_INTERNAL void nu_lock(struct m0_dtm_nu *nu)
enum m0_dtm_up_rule up_rule
M0_INTERNAL bool up_is_earlier(struct m0_dtm_up *up0, struct m0_dtm_up *up1)
M0_INTERNAL void m0_dtm_op_close(const struct m0_dtm_op *op)
void(* doo_ready)(struct m0_dtm_op *op)
static int up_cmp(const struct m0_dtm_up *up, m0_dtm_ver_t hver)
M0_INTERNAL void m0_dtm_nuclei_fini(void)
M0_INTERNAL void m0_dtm_op_fini(struct m0_dtm_op *op)
M0_INTERNAL void nu_unlock(struct m0_dtm_nu *nu)
static void up_fini(struct m0_dtm_up *up)
static long long min(long long a, long long b)
#define M0_MAGIX_OFFSET(type, field)
M0_INTERNAL struct m0_dtm_up * m0_dtm_up_prior(struct m0_dtm_up *up)
static void op_del(struct m0_dtm_op *op)
M0_INTERNAL bool op_state(const struct m0_dtm_op *op, enum m0_dtm_state state)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
void check(struct workload *w)
M0_INTERNAL void hi_print(const struct m0_dtm_hi *hi)
M0_INTERNAL void m0_dtm_up_init(struct m0_dtm_up *up, struct m0_dtm_hi *hi, struct m0_dtm_op *op, enum m0_dtm_up_rule rule, m0_dtm_ver_t ver, m0_dtm_ver_t orig_ver)
M0_INTERNAL void m0_dtm_hi_init(struct m0_dtm_hi *hi, struct m0_dtm_nu *nu)
static const struct m0_bob_type hi_bob
static void advance_op(struct m0_dtm_op *op)
M0_INTERNAL struct m0_dtm_up * hi_earliest(struct m0_dtm_hi *hi)
M0_INTERNAL void m0_dtm_nu_fini(struct m0_dtm_nu *nu)
static int scan(struct scanner *s)
M0_INTERNAL void advance_try(const struct m0_dtm_op *op)
void(* doo_late)(struct m0_dtm_op *op)
M0_BOB_DEFINE(static, &hi_bob, m0_dtm_hi)
M0_INTERNAL void m0_bob_type_tlist_init(struct m0_bob_type *bt, const struct m0_tl_descr *td)
M0_INTERNAL void m0_dtm_op_prepared(const struct m0_dtm_op *op)
static struct m0_addb2_frame_header last
M0_TL_DESCR_DEFINE(hi, "nucleus hi updates", M0_INTERNAL, struct m0_dtm_up, up_hi_linkage, up_magix, M0_DTM_UP_MAGIX, M0_DTM_HI_MAGIX)
#define m0_tl_forall(name, var, head,...)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL struct m0_dtm_up * hi_latest(struct m0_dtm_hi *hi)