sxstate sx_begin(sxmanager *m, sx *x, sxtype type, uint64_t vlsn) { sx_promote(x, SXREADY); x->type = type; x->log_read = -1; sr_seqlock(m->r->seq); x->csn = m->csn; x->id = sr_seqdo(m->r->seq, SR_TSNNEXT); if (sslikely(vlsn == 0)) x->vlsn = sr_seqdo(m->r->seq, SR_LSN); else x->vlsn = vlsn; sr_sequnlock(m->r->seq); sx_init(m, x); ss_spinlock(&m->lock); ssrbnode *n = NULL; int rc = sx_matchtx(&m->i, NULL, (char*)&x->id, sizeof(x->id), &n); if (rc == 0 && n) { assert(0); } else { ss_rbset(&m->i, n, rc, &x->node); } if (type == SXRO) m->count_rd++; else m->count_rw++; ss_spinunlock(&m->lock); return SXREADY; }
sxstate sx_begin(sxmanager *m, sx *t, uint64_t vlsn) { t->s = SXREADY; t->complete = 0; sr_seqlock(m->seq); t->id = sr_seqdo(m->seq, SR_TSNNEXT); if (sslikely(vlsn == 0)) t->vlsn = sr_seqdo(m->seq, SR_LSN); else t->vlsn = vlsn; sr_sequnlock(m->seq); sx_init(m, t); ss_spinlock(&m->lock); ssrbnode *n = NULL; int rc = sx_matchtx(&m->i, NULL, (char*)&t->id, sizeof(t->id), &n); if (rc == 0 && n) { assert(0); } else { ss_rbset(&m->i, n, rc, &t->node); } m->count++; ss_spinunlock(&m->lock); return SXREADY; }