package org.wonderdb.freeblock; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.wonderdb.thread.ThreadPoolExecutorWrapper; import org.wonderdb.txnlogger.TransactionId; import org.wonderdb.types.BlockPtr; public class FreeBlockFactory { private static FreeBlockFactory instance = new FreeBlockFactory(); ConcurrentMap<Byte, FreeBlockMgrNew> freeBlocksMgrMap = new ConcurrentHashMap<Byte, FreeBlockMgrNew>(); ThreadPoolExecutorWrapper threadPool = new ThreadPoolExecutorWrapper(5, 5, 5, 10, "freeBlock"); static long val = 2048*100; private FreeBlockFactory() { } public static FreeBlockFactory getInstance() { return instance; } public void shutdown() { threadPool.shutdown(); } public void createNewMgr(byte fileId, TransactionId txnId, int lowWatermarkMultiplier, int highWatermarkMultiplier) { FreeBlockMgrNew fbm = new FreeBlockMgrNew(fileId, txnId, lowWatermarkMultiplier, highWatermarkMultiplier); freeBlocksMgrMap.put(fileId, fbm); } public void createNewMgr(byte fileId, int lowWatermarkMultiplier, int highWatermarkMultiplier) { FreeBlockMgrNew fbm = new FreeBlockMgrNew(fileId, lowWatermarkMultiplier, highWatermarkMultiplier); freeBlocksMgrMap.put(fileId, fbm); } public void initialize(byte fileId, int lowWatermarkMultiplier, int highWatermarkMultiplier) { FreeBlockMgrNew fbm = new FreeBlockMgrNew(fileId, lowWatermarkMultiplier, highWatermarkMultiplier); freeBlocksMgrMap.put(fileId, fbm); } public long getFreeBlockPosn(byte fileId) { // long retVal = val; // val = val + 2048; // return retVal; return freeBlocksMgrMap.get(fileId).getFreePosn(); } public void returnBlock(BlockPtr ptr) { // if (ptr != null && ptr.getFileId() >= 0) { // freeBlocksMgrMap.get(ptr.getFileId()).returnBlock(ptr); // } } public void triggerWrite(FreeBlockMgrNew freeBlockMgr) { ReadFromBackEnd rfbe = new ReadFromBackEnd(freeBlockMgr, false); threadPool.asynchrounousExecute(rfbe); } public void triggerRead(FreeBlockMgrNew freeBlockMgr) { ReadFromBackEnd rfbe = new ReadFromBackEnd(freeBlockMgr, true); threadPool.asynchrounousExecute(rfbe); } private static class ReadFromBackEnd implements Callable<Boolean> { FreeBlockMgrNew freeBlockMgr = null; boolean isRead = false; private ReadFromBackEnd(FreeBlockMgrNew freeBlockMgr, boolean isRead) { this.freeBlockMgr = freeBlockMgr; this.isRead = isRead; } @Override public Boolean call() throws Exception { if (isRead) { freeBlockMgr.read(); } else { freeBlockMgr.write(); } return true; } } }