32 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_UT 270 memcpy(
x->data, &
x->captured,
x->size);
290 .captured.u128 =
M0_UINT128(0xdeadd00d8badf00d,
295 .captured.complex = { .
real = 18, .imag = 4 }
308 for (
x = xs;
x->size != 0; ++
x) {
314 for (
x = xs;
x->size != 0; ++
x)
318 for (
x = xs;
x->size != 0; ++
x) {
324 for (
x = xs;
x->size != 0; ++
x) {
353 for (
x = xs;
x->size != 0; ++
x) {
354 for (
i = 0;
i < nr_grps;
i++) {
355 if (
x->tx.t_group == grps[
i])
break;
359 grps[
i] =
x->tx.t_group;
367 for (
i = 0,
x = xs;
x->size != 0; ) {
372 while (
x->tx.t_group != grps[
i] &&
x->size != 0)
392 .captured.u128 =
M0_UINT128(0xdeadd00d8badf00d,
397 .captured.complex = { .
real = 18, .imag = 4 }
410 for (
x = xs;
x->size != 0; ++
x) {
416 for (
x = xs;
x->size != 0; ++
x)
421 for (
x = xs;
x->size != 0; ++
x) {
432 for (
x = xs;
x->size != 0; ++
x) {
439 for (
x = xs;
x->size != 0; ++
x) {
515 1, regs[
i].br_size));
627 switch (txf[
i].txf_state) {
819 test->bugc_ringbuf[*
test->bugc_rb_pos] =
test->bugc_index;
820 ++*
test->bugc_rb_pos;
866 int gc_enabled_nr = 0;
888 .bugc_gc_enabled =
false,
889 .bugc_ringbuf = ringbuf,
890 .bugc_rb_pos = &rb_pos,
891 .bugc_rb_ready = &rb_ready,
892 .bugc_rb_lock = &rb_lock,
894 .bugc_gc_done = &gc_done,
901 gc_enabled_nr += gc_enabled;
936 for (
i = 0;
i < gc_enabled_nr; ++
i)
997 #define TX_PAYLOAD_TEST(credit, fill, capture, offset) { \ 998 .tpt_credit = (credit), \ 999 .tpt_fill = (fill), \ 1000 .tpt_capture = (capture), \ 1001 .tpt_offset = (offset), \ 1024 for (
i = 0;
i <
nr; ++
i) {
1026 if (
test[
i].tpt_capture > 0) {
1042 if (
test[
i].tpt_capture > 0) {
1046 test[
i].tpt_offset);
1086 special_cases[
i].tpt_seg =
seg;
1110 #undef TX_PAYLOAD_TEST 1112 #undef M0_TRACE_SUBSYSTEM
void m0_be_ut_seg_fini(struct m0_be_ut_seg *ut_seg)
static void ptr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
#define M0_BE_TX_CREDIT_PTR(ptr)
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
#define M0_ALLOC_ARR(arr, nr)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
static void be_ut_tx_reg_rand(struct m0_be_reg *reg, struct m0_be_seg *seg, uint64_t *seed)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
M0_INTERNAL bool m0_semaphore_trydown(struct m0_semaphore *semaphore)
int m0_thread_join(struct m0_thread *q)
void m0_be_ut_tx_payload(void)
const m0_time_t M0_TIME_NEVER
static struct m0_sm_group * grp
void m0_be_ut_tx_concurrent_excl(void)
struct m0_be_seg * bus_seg
#define M0_BE_REG_PTR(seg, ptr)
static void * be_ut_tx_alloc(void **alloc, m0_bcount_t size)
struct m0_semaphore * bugc_rb_ready
const struct m0_be_tx_credit m0_be_tx_credit_invalid
void m0_be_ut_tx_usecase_failure(void)
struct m0_semaphore * txf_global_sem
void m0_be_ut_tx_capturing(void)
void m0_be_ut_tx_states(void)
struct m0_be_ut_seg ut_seg
void m0_be_ut_seg_init(struct m0_be_ut_seg *ut_seg, struct m0_be_ut_backend *ut_be, m0_bcount_t size)
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
struct m0_be_seg * tpt_seg
struct m0_semaphore * bugc_gc_done
#define container_of(ptr, type, member)
#define M0_BE_TX_CREDIT_TYPE(type)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
void m0_be_ut_tx_usecase_success(void)
M0_INTERNAL void m0_be_tx_put(struct m0_be_tx *tx)
#define M0_BE_REG(seg, size, addr)
void m0_be_ut_tx_fast(void)
static uint64_t be_ut_tx_payload_seed
struct m0_be_tx * bugc_tx
static void be_ut_tx_thread(struct be_ut_tx_thread_state *state)
struct m0_be_tx_credit cred
void m0_be_ut_tx_empty(void)
#define M0_BE_TX_CREDIT(nr, size)
static void be_ut_tx_buf_fill_random(char *data, m0_bcount_t size)
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
M0_INTERNAL m0_bcount_t m0_be_seg_reserved(const struct m0_be_seg *seg)
struct m0_be_ut_backend ut_be
struct m0_semaphore txf_sem
static void be_ut_tx_alloc_fini(void **alloc)
void m0_be_ut_tx_persistence(void)
void m0_be_ut_tx_concurrent(void)
static bool be_ut_tx_fast_cb(struct m0_clink *clink)
static void be_ut_tx_fast_gc_free(struct m0_be_tx *tx, void *param)
M0_INTERNAL void m0_be_tx_credit_mul(struct m0_be_tx_credit *c, m0_bcount_t k)
M0_INTERNAL void m0_be_tx_credit_add(struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
static void be_ut_tx_test(size_t nr)
M0_INTERNAL void m0_be_tx_open(struct m0_be_tx *tx)
void m0_thread_fini(struct m0_thread *q)
static void be_ut_tx_reg_rand_fill(struct m0_be_reg *reg, uint64_t *seed)
void m0_be_ut_backend_init(struct m0_be_ut_backend *ut_be)
static struct ff2c_term * alloc(void)
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
const union be_ut_tx_x::@85 captured
struct m0_sm_group * sm_grp
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
static void be_ut_transact(struct be_ut_tx_x *x, struct m0_be_seg *seg, void **alloc)
M0_INTERNAL int m0_be_tx_exclusive_open_sync(struct m0_be_tx *tx)
static struct be_ut_gc_test be_ut_gc_tests[BE_UT_TX_GC_TX_NR]
struct m0_thread tts_thread
void m0_be_ut_tx_concurrent_helper(bool exclusive)
static struct m0_clink clink[RDWR_REQUEST_MAX]
static void be_ut_tx_force(size_t nr)
static void be_ut_tx_gc_free(struct m0_be_tx *tx, void *param)
M0_INTERNAL void m0_be_tx_close(struct m0_be_tx *tx)
static void be_ut_tx_gc_free_tx_failed(struct m0_be_tx *tx, void *param)
M0_BASSERT(BE_UT_TX_CAPTURING_RANGE >=sizeof(uint64_t))
static void be_ut_tx_payload_test_nr(struct m0_be_ut_backend *ut_be, struct be_ut_tx_payload_test *test, size_t nr)
M0_INTERNAL enum m0_be_tx_state m0_be_tx_state(const struct m0_be_tx *tx)
void m0_be_ut_tx_single(void)
M0_INTERNAL int m0_be_tx_timedwait(struct m0_be_tx *tx, uint64_t states, m0_time_t deadline)
M0_INTERNAL uint64_t m0_rnd64(uint64_t *seed)
static void be_ut_tx_alloc_init(void **alloc, struct m0_be_seg *seg)
#define M0_ALLOC_PTR(ptr)
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
M0_INTERNAL void m0_be_tx_get(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
struct m0_mutex * bugc_rb_lock
struct be_ut_complex complex
void m0_be_ut_tx_init(struct m0_be_tx *tx, struct m0_be_ut_backend *ut_be)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
void m0_be_ut_backend_fini(struct m0_be_ut_backend *ut_be)
void m0_be_ut_tx_several(void)
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
M0_INTERNAL void m0_be_tx_gc_enable(struct m0_be_tx *tx, void(*gc_free)(struct m0_be_tx *, void *param), void *param)
static struct m0_be_seg * seg
#define M0_UINT128(hi, lo)
M0_INTERNAL void m0_be_tx_payload_prep(struct m0_be_tx *tx, m0_bcount_t size)
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
#define TX_PAYLOAD_TEST(credit, fill, capture, offset)
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
M0_INTERNAL void m0_be_tx_capture(struct m0_be_tx *tx, const struct m0_be_reg *reg)
struct m0_be_seg * br_seg
static void be_ut_tx_run_tx_helper(struct be_ut_tx_thread_state *state, struct m0_be_tx *tx, bool exclusive)
struct m0_clink bugc_clink
struct m0_clink txf_clink
void m0_be_ut_tx_force(void)
void m0_be_ut_tx_gc(void)
M0_INTERNAL void m0_be_tx_force(struct m0_be_tx *tx)
void m0_be_ut_backend_thread_exit(struct m0_be_ut_backend *ut_be)
static void be_ut_tx_do_force(struct be_ut_tx_x *xs, size_t nr)
static bool be_ut_tx_gc_cb(struct m0_clink *clink)
#define M0_IMPOSSIBLE(fmt,...)
struct m0_be_ut_backend * tts_ut_be