extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/LockUtil.java

Code
Comments
Other
Rev Date Author Line
2613 29 Aug 14 nicklas 1 package net.sf.basedb.reggie;
2613 29 Aug 14 nicklas 2
2613 29 Aug 14 nicklas 3 import java.util.concurrent.TimeUnit;
2613 29 Aug 14 nicklas 4 import java.util.concurrent.locks.ReentrantLock;
2613 29 Aug 14 nicklas 5
2613 29 Aug 14 nicklas 6 import net.sf.basedb.core.DbControl;
2613 29 Aug 14 nicklas 7 import net.sf.basedb.core.TransactionalAction;
2613 29 Aug 14 nicklas 8
2613 29 Aug 14 nicklas 9 /**
2613 29 Aug 14 nicklas 10   Utility functions for locking.
2613 29 Aug 14 nicklas 11   @since 2.16
2613 29 Aug 14 nicklas 12 */
2613 29 Aug 14 nicklas 13 public class LockUtil 
2613 29 Aug 14 nicklas 14   implements TransactionalAction
2613 29 Aug 14 nicklas 15 {
2613 29 Aug 14 nicklas 16   /**
2613 29 Aug 14 nicklas 17     Try to acquire the given lock for as long as the transaction lasts.
2613 29 Aug 14 nicklas 18     Once the transaction completes (commit or rollback) the lock is
2613 29 Aug 14 nicklas 19     released.
2613 29 Aug 14 nicklas 20
2613 29 Aug 14 nicklas 21     @param dc The transaction to attach the lock to
2613 29 Aug 14 nicklas 22     @param lock The lock to aquire
2613 29 Aug 14 nicklas 23     @return TRUE if the lock could be aquired (within 5 seconds), FALSE if not
2613 29 Aug 14 nicklas 24   */
2613 29 Aug 14 nicklas 25   public static boolean acquireLockForTransaction(DbControl dc, ReentrantLock lock)
2613 29 Aug 14 nicklas 26   {
2613 29 Aug 14 nicklas 27     try
2613 29 Aug 14 nicklas 28     {
2613 29 Aug 14 nicklas 29       lock.tryLock(5, TimeUnit.SECONDS);
2613 29 Aug 14 nicklas 30     }
2613 29 Aug 14 nicklas 31     catch (InterruptedException ex)
2613 29 Aug 14 nicklas 32     {}
2613 29 Aug 14 nicklas 33     boolean isLocked = lock.isHeldByCurrentThread();
2613 29 Aug 14 nicklas 34     if (isLocked)
2613 29 Aug 14 nicklas 35     {
2613 29 Aug 14 nicklas 36       dc.addTransactionalAction(new LockUtil(lock));
2613 29 Aug 14 nicklas 37     }
2613 29 Aug 14 nicklas 38     return isLocked;
2613 29 Aug 14 nicklas 39   }
2613 29 Aug 14 nicklas 40
2613 29 Aug 14 nicklas 41   private final ReentrantLock lock;
2613 29 Aug 14 nicklas 42   
2613 29 Aug 14 nicklas 43   private LockUtil(ReentrantLock lock)
2613 29 Aug 14 nicklas 44   {
2613 29 Aug 14 nicklas 45     this.lock = lock;
2613 29 Aug 14 nicklas 46   }
2613 29 Aug 14 nicklas 47
2613 29 Aug 14 nicklas 48   @Override
2613 29 Aug 14 nicklas 49   public void onRollback() 
2613 29 Aug 14 nicklas 50   {
2613 29 Aug 14 nicklas 51     if (lock.isHeldByCurrentThread())
2613 29 Aug 14 nicklas 52     {
2613 29 Aug 14 nicklas 53       lock.unlock();
2613 29 Aug 14 nicklas 54     }
2613 29 Aug 14 nicklas 55   }
2613 29 Aug 14 nicklas 56   
2613 29 Aug 14 nicklas 57   @Override
2613 29 Aug 14 nicklas 58   public void onBeforeCommit() 
2613 29 Aug 14 nicklas 59   {}
2613 29 Aug 14 nicklas 60   
2613 29 Aug 14 nicklas 61   @Override
2613 29 Aug 14 nicklas 62   public void onAfterCommit() 
2613 29 Aug 14 nicklas 63   {
2613 29 Aug 14 nicklas 64     if (lock.isHeldByCurrentThread())
2613 29 Aug 14 nicklas 65     {
2613 29 Aug 14 nicklas 66       lock.unlock();
2613 29 Aug 14 nicklas 67     }
2613 29 Aug 14 nicklas 68   }
2613 29 Aug 14 nicklas 69
2613 29 Aug 14 nicklas 70
2613 29 Aug 14 nicklas 71 }