void DtxWorkRecord::abort() { if (txn.get()) { store->abort(*txn); txn.reset(); } std::for_each(work.begin(), work.end(), mem_fn(&TxBuffer::rollback)); }
bool DtxWorkRecord::commit(bool onePhase) { Mutex::ScopedLock locker(lock); if (check()) { if (prepared) { //already prepared i.e. 2pc if (onePhase) { throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has been prepared, one-phase option not valid!")); } store->commit(*txn); txn.reset(); std::for_each(work.begin(), work.end(), mem_fn(&TxBuffer::commit)); return true; } else { //1pc commit optimisation, don't need a 2pc transaction context: if (!onePhase) { throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has not been prepared, one-phase option required!")); } std::auto_ptr<TransactionContext> localtxn = store->begin(); if (prepare(localtxn.get())) { store->commit(*localtxn); std::for_each(work.begin(), work.end(), mem_fn(&TxBuffer::commit)); return true; } else { store->abort(*localtxn); abort(); //TODO: this should probably be flagged as internal error return false; } } } else { //some part of the work has been marked rollback only abort(); return false; } }
int main() { using boost::mem_fn; X x; X const & rcx = x; X const * pcx = &x; boost::shared_ptr<X> sp(new X); mem_fn(&X::f0)(x); mem_fn(&X::f0)(&x); mem_fn(&X::f0)(sp); mem_fn(&X::g0)(x); mem_fn(&X::g0)(rcx); mem_fn(&X::g0)(&x); mem_fn(&X::g0)(pcx); mem_fn(&X::g0)(sp); mem_fn(&X::f1)(x, 1); mem_fn(&X::f1)(&x, 1); mem_fn(&X::f1)(sp, 1); mem_fn(&X::g1)(x, 1); mem_fn(&X::g1)(rcx, 1); mem_fn(&X::g1)(&x, 1); mem_fn(&X::g1)(pcx, 1); mem_fn(&X::g1)(sp, 1); mem_fn(&X::f2)(x, 1, 2); mem_fn(&X::f2)(&x, 1, 2); mem_fn(&X::f2)(sp, 1, 2); mem_fn(&X::g2)(x, 1, 2); mem_fn(&X::g2)(rcx, 1, 2); mem_fn(&X::g2)(&x, 1, 2); mem_fn(&X::g2)(pcx, 1, 2); mem_fn(&X::g2)(sp, 1, 2); mem_fn(&X::f3)(x, 1, 2, 3); mem_fn(&X::f3)(&x, 1, 2, 3); mem_fn(&X::f3)(sp, 1, 2, 3); mem_fn(&X::g3)(x, 1, 2, 3); mem_fn(&X::g3)(rcx, 1, 2, 3); mem_fn(&X::g3)(&x, 1, 2, 3); mem_fn(&X::g3)(pcx, 1, 2, 3); mem_fn(&X::g3)(sp, 1, 2, 3); mem_fn(&X::f4)(x, 1, 2, 3, 4); mem_fn(&X::f4)(&x, 1, 2, 3, 4); mem_fn(&X::f4)(sp, 1, 2, 3, 4); mem_fn(&X::g4)(x, 1, 2, 3, 4); mem_fn(&X::g4)(rcx, 1, 2, 3, 4); mem_fn(&X::g4)(&x, 1, 2, 3, 4); mem_fn(&X::g4)(pcx, 1, 2, 3, 4); mem_fn(&X::g4)(sp, 1, 2, 3, 4); mem_fn(&X::f5)(x, 1, 2, 3, 4, 5); mem_fn(&X::f5)(&x, 1, 2, 3, 4, 5); mem_fn(&X::f5)(sp, 1, 2, 3, 4, 5); mem_fn(&X::g5)(x, 1, 2, 3, 4, 5); mem_fn(&X::g5)(rcx, 1, 2, 3, 4, 5); mem_fn(&X::g5)(&x, 1, 2, 3, 4, 5); mem_fn(&X::g5)(pcx, 1, 2, 3, 4, 5); mem_fn(&X::g5)(sp, 1, 2, 3, 4, 5); mem_fn(&X::f6)(x, 1, 2, 3, 4, 5, 6); mem_fn(&X::f6)(&x, 1, 2, 3, 4, 5, 6); mem_fn(&X::f6)(sp, 1, 2, 3, 4, 5, 6); mem_fn(&X::g6)(x, 1, 2, 3, 4, 5, 6); mem_fn(&X::g6)(rcx, 1, 2, 3, 4, 5, 6); mem_fn(&X::g6)(&x, 1, 2, 3, 4, 5, 6); mem_fn(&X::g6)(pcx, 1, 2, 3, 4, 5, 6); mem_fn(&X::g6)(sp, 1, 2, 3, 4, 5, 6); mem_fn(&X::f7)(x, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::f7)(&x, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::f7)(sp, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::g7)(x, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::g7)(rcx, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::g7)(&x, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::g7)(pcx, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::g7)(sp, 1, 2, 3, 4, 5, 6, 7); mem_fn(&X::f8)(x, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::f8)(&x, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::f8)(sp, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::g8)(x, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::g8)(rcx, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::g8)(&x, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::g8)(pcx, 1, 2, 3, 4, 5, 6, 7, 8); mem_fn(&X::g8)(sp, 1, 2, 3, 4, 5, 6, 7, 8); return detect_errors(x.hash == 17610 && sp->hash == 2155); }
void TxBuffer::rollback() { observer->rollback(); std::for_each(ops.begin(), ops.end(), mem_fn(&TxOp::rollback)); ops.clear(); }
void TxBuffer::commit() { observer->commit(); std::for_each(ops.begin(), ops.end(), mem_fn(&TxOp::commit)); ops.clear(); }
int main() { using boost::mem_fn; mem_fn(&X::f0)( make() ); mem_fn(&X::g0)( make() ); mem_fn(&X::f1)( make(), 1 ); mem_fn(&X::g1)( make(), 1 ); mem_fn(&X::f2)( make(), 1, 2 ); mem_fn(&X::g2)( make(), 1, 2 ); mem_fn(&X::f3)( make(), 1, 2, 3 ); mem_fn(&X::g3)( make(), 1, 2, 3 ); mem_fn(&X::f4)( make(), 1, 2, 3, 4 ); mem_fn(&X::g4)( make(), 1, 2, 3, 4 ); mem_fn(&X::f5)( make(), 1, 2, 3, 4, 5 ); mem_fn(&X::g5)( make(), 1, 2, 3, 4, 5 ); mem_fn(&X::f6)( make(), 1, 2, 3, 4, 5, 6 ); mem_fn(&X::g6)( make(), 1, 2, 3, 4, 5, 6 ); mem_fn(&X::f7)( make(), 1, 2, 3, 4, 5, 6, 7 ); mem_fn(&X::g7)( make(), 1, 2, 3, 4, 5, 6, 7 ); mem_fn(&X::f8)( make(), 1, 2, 3, 4, 5, 6, 7, 8 ); mem_fn(&X::g8)( make(), 1, 2, 3, 4, 5, 6, 7, 8 ); return detect_errors( hash == 2155 ); }