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

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