You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by oz...@apache.org on 2004/07/01 14:34:50 UTC

cvs commit: jakarta-slide/src/share/org/apache/slide/store ExtendedStore.java

ozeigermann    2004/07/01 05:34:50

  Modified:    src/share/org/apache/slide/store ExtendedStore.java
  Log:
  Added real suspension
  
  Revision  Changes    Path
  1.12      +65 -32    jakarta-slide/src/share/org/apache/slide/store/ExtendedStore.java
  
  Index: ExtendedStore.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/ExtendedStore.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ExtendedStore.java	21 Jun 2004 15:58:49 -0000	1.11
  +++ ExtendedStore.java	1 Jul 2004 12:34:50 -0000	1.12
  @@ -24,9 +24,11 @@
   package org.apache.slide.store;
   
   import java.util.Enumeration;
  +import java.util.HashMap;
   import java.util.HashSet;
   import java.util.Hashtable;
   import java.util.Iterator;
  +import java.util.Map;
   import java.util.Vector;
   
   import org.apache.slide.common.ServiceAccessException;
  @@ -132,6 +134,7 @@
   
       protected boolean globalCacheOff;
   
  +    private Map suspendedLocks = new HashMap();
   
       public ExtendedStore() {
           lockManager = new GenericLockManager(1, new StoreLogger(getLogger(), LOG_CHANNEL));
  @@ -372,33 +375,42 @@
               noGlobalCacheInTx);
       }
   
  -    public void exclusiveTransientLock(String uri) throws ServiceAccessException {
  -        Xid txId = (Xid) activeTransactionBranch.get();
  -        try {
  -            GenericLock lock = (GenericLock) lockManager.atomicGetOrCreateLock(uri);
  -            if (lock.getLockLevel(txId) != 1) {
  -                Object owner = lock.getOwner();
  -                getLogger().log(
  -                    "Try lock: "
  -                        + txId
  -                        + " tries "
  -                        + uri
  -                        + (owner != null ? " ---> " + owner.toString() + " has it" : ""),
  -                    LOG_CHANNEL,
  -                    Logger.DEBUG);
  -                if (!lock.acquire(txId, 1, true, true, timeout)) {
  -                    throw new ServiceAccessException(this, new ConflictException(uri));
  -                }
  -                ((HashSet)locks.get()).add(lock);
  -                getLogger().log("Has lock: " + txId + " locks " + uri, LOG_CHANNEL, Logger.DEBUG);
  -            }
  -        } catch (InterruptedException e) {
  -            throw new ServiceAccessException(this, new ConflictException(uri));
  -        }
  -    }
  +    public void exclusiveTransientLock(String uri)
  +			throws ServiceAccessException {
  +		Xid txId = (Xid) activeTransactionBranch.get();
  +		if (txId != null) {
  +			try {
  +				GenericLock lock = (GenericLock) lockManager
  +						.atomicGetOrCreateLock(uri);
  +				if (lock.getLockLevel(txId) != 1) {
  +					Object owner = lock.getOwner();
  +					getLogger()
  +							.log(
  +									"Try lock: "
  +											+ txId
  +											+ " tries "
  +											+ uri
  +											+ (owner != null ? " ---> "
  +													+ owner.toString()
  +													+ " has it" : ""),
  +									LOG_CHANNEL, Logger.DEBUG);
  +					if (!lock.acquire(txId, 1, true, true, timeout)) {
  +						throw new ServiceAccessException(this,
  +								new ConflictException(uri));
  +					}
  +					((HashSet) locks.get()).add(lock);
  +					getLogger().log("Has lock: " + txId + " locks " + uri,
  +							LOG_CHANNEL, Logger.DEBUG);
  +				}
  +			} catch (InterruptedException e) {
  +				throw new ServiceAccessException(this, new ConflictException(
  +						uri));
  +			}
  +		}
  +	}
   
       //
  -    // overloaded content methods with caching 
  +    // overloaded content methods with caching
       //
   
       public NodeRevisionContent retrieveRevisionContent(Uri uri, NodeRevisionDescriptor revisionDescriptor)
  @@ -931,10 +943,16 @@
   
       // FIXME needs suspend and resume here as well!
       public void start(Xid xid, int flags) throws XAException {
  -        // XXX we do not suspend, so we do not resume
  +        System.out.println(
  +                "Thread "
  +                    + Thread.currentThread()
  +                    + (flags == TMNOFLAGS ? " starts" : flags == TMJOIN ? " joins" : " resumes")
  +                    + " work on behalf of transaction branch "
  +                    + xid);
  +        
  +        Xid txId = (Xid) XidWrapper.wrap(xid);
  +        activeTransactionBranch.set(txId);
           if (flags == TMNOFLAGS || flags == TMJOIN) {
  -            Xid txId = (Xid) XidWrapper.wrap(xid);
  -            activeTransactionBranch.set(txId);
   
               locks.set(new HashSet());
   
  @@ -945,10 +963,25 @@
               descriptorCache.getTxCache().start(txId);
               if (contentCache != null)
                   contentCache.getTxCache().start(txId);
  +        } else {
  +        	locks.set(suspendedLocks.remove(txId));
           }
       }
   
       public void end(Xid xid, int flags) throws XAException {
  +        System.out.println(
  +                "Thread "
  +                    + Thread.currentThread()
  +                    + (flags == TMSUSPEND ? " suspends" : flags == TMFAIL ? " fails" : " ends")
  +                    + " work on behalf of transaction branch "
  +                    + xid);
  +
  +        if (flags == TMSUSPEND) {
  +            Xid txId = (Xid) XidWrapper.wrap(xid);
  +        	suspendedLocks.put(txId, locks.get());
  +        }
  +        locks.set(null);
  +        activeTransactionBranch.set(null);
       }
   
       //
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org