/*
 * JBoss, the OpenSource J2EE webOS
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */

package org.jboss.cache.lock;

//import EDU.oswego.cs.dl.util.concurrent.Sync;
//import EDU.oswego.cs.dl.util.concurrent.Semaphore;
//import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;

import org.jboss.logging.Logger;

/**
 * NonBlockingWriterLock is a read/write lock (with upgrade) that has
 * non-blocking write lock acquisition on existing read lock(s).
 * <p>Note that the write lock is exclusive among write locks, e.g.,
 * only one write lock can be granted at one time, but the write lock
 * is independent of the read locks. For example,
 * a read lock to be acquired will be blocked if there is existing write lock, but
 * will not be blocked if there are mutiple read locks already granted to other
 * owners. On the other hand, a write lock can be acquired as long as there
 * is no existing write lock, regardless how many read locks have been
 * granted.
 *
 * @author Ben Wang
 * @version $Id: NonBlockingWriterLock.java,v 1.1.2.4 2004/09/23 18:42:37 bwang00 Exp $
 */
public class NonBlockingWriterLock extends ReadWriteLockWithUpgrade
{
   protected static Logger log_ = Logger.getLogger(NonBlockingWriterLock.class);

   // Only need to overwrite this method so WL is not blocked on RL.
   protected synchronized boolean startWrite()
   {
      boolean allowWrite = (activeWriter_ == null);
      if (allowWrite) activeWriter_ = Thread.currentThread();
      return allowWrite;
   }
}
