package org.multiverse.stms.gamma.transactions.lean; import org.multiverse.api.TxnFactoryBuilder; import org.multiverse.stms.gamma.GammaStm; import org.multiverse.stms.gamma.transactions.GammaTxn; import org.multiverse.stms.gamma.transactions.GammaTxnConfig; import org.multiverse.stms.gamma.transactions.GammaTxnFactory; import org.multiverse.stms.gamma.transactions.GammaTxnPool; import static org.multiverse.stms.gamma.transactions.ThreadLocalGammaTxnPool.getThreadLocalGammaTxnPool; public class LeanFixedLengthGammaTxnFactory implements GammaTxnFactory { private final GammaTxnConfig config; public LeanFixedLengthGammaTxnFactory(GammaStm stm) { this(new GammaTxnConfig(stm)); } public LeanFixedLengthGammaTxnFactory(GammaStm stm, int fixedLengthSize) { this(new GammaTxnConfig(stm, fixedLengthSize)); } public LeanFixedLengthGammaTxnFactory(GammaTxnConfig config) { this.config = config.init(); } @Override public TxnFactoryBuilder getTxnFactoryBuilder() { throw new UnsupportedOperationException(); } @Override public GammaTxnConfig getConfig() { return config; } @Override public GammaTxn upgradeAfterSpeculativeFailure(GammaTxn failingTransaction, GammaTxnPool pool) { throw new UnsupportedOperationException(); } @Override public LeanFixedLengthGammaTxn newTxn() { return newTransaction(getThreadLocalGammaTxnPool()); } @Override public LeanFixedLengthGammaTxn newTransaction(GammaTxnPool pool) { LeanFixedLengthGammaTxn tx = pool.takeLeanFixedLength(); if (tx == null) { tx = new LeanFixedLengthGammaTxn(config); } else { tx.init(config); } return tx; } }