001package com.hammurapi.store; 002 003import java.util.concurrent.TimeUnit; 004import java.util.concurrent.locks.Condition; 005import java.util.concurrent.locks.Lock; 006 007/** 008 * This class tracks number of locks acquired by current thread. 009 * @author Pavel Vlasov 010 * 011 */ 012public abstract class AbstractTrackingLock implements TrackingLock { 013 014 protected abstract void incCounter(); 015 protected abstract void decCounter(); 016 protected abstract int getCounter(); 017 018 private Lock master; 019 020 public boolean isLocked() { 021 return getCounter()>0; 022 } 023 024 public AbstractTrackingLock(Lock master) { 025 this.master = master; 026 } 027 028 @Override 029 public void lock() { 030 master.lock(); 031 incCounter(); 032 } 033 034 @Override 035 public void lockInterruptibly() throws InterruptedException { 036 master.lockInterruptibly(); 037 incCounter(); 038 } 039 040 @Override 041 public boolean tryLock() { 042 if (master.tryLock()) { 043 incCounter(); 044 return true; 045 } 046 return false; 047 } 048 049 @Override 050 public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { 051 if (master.tryLock(time, unit)) { 052 incCounter(); 053 return true; 054 } 055 return false; 056 } 057 058 @Override 059 public void unlock() { 060 master.unlock(); 061 decCounter(); 062 } 063 064 @Override 065 public Condition newCondition() { 066 return master.newCondition(); 067 } 068 069}