diff options
author | Caspar De Groot | 2011-08-18 02:24:31 +0000 |
---|---|---|
committer | Caspar De Groot | 2011-08-18 02:24:31 +0000 |
commit | b7e84a0e190445f303dc8fa918cd5a7c6c0670f6 (patch) | |
tree | 776782d6099f9228e8764ce57b692914e9b80812 /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java | |
parent | 8c9b3bb2192a53b7ee1eff6035462f04c20ba842 (diff) | |
download | cdo-b7e84a0e190445f303dc8fa918cd5a7c6c0670f6.tar.gz cdo-b7e84a0e190445f303dc8fa918cd5a7c6c0670f6.tar.xz cdo-b7e84a0e190445f303dc8fa918cd5a7c6c0670f6.zip |
[353691] Add lock notifications and lock caching
https://bugs.eclipse.org/bugs/show_bug.cgi?id=353691
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java index 4a39ec7d44..293f899465 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java @@ -27,6 +27,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDGenerator; import org.eclipse.emf.cdo.common.lob.CDOLobInfo; import org.eclipse.emf.cdo.common.lob.CDOLobStore; +import org.eclipse.emf.cdo.common.lock.CDOLockChangeInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.protocol.CDOAuthenticator; @@ -89,6 +90,7 @@ import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.collection.Pair; import org.eclipse.net4j.util.concurrent.IRWLockManager; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; +import org.eclipse.net4j.util.concurrent.IRWOLockManager; import org.eclipse.net4j.util.concurrent.RWOLockManager; import org.eclipse.net4j.util.event.Event; import org.eclipse.net4j.util.event.EventUtil; @@ -183,7 +185,7 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme } }; - private IRWLockManager<CDOSessionImpl, Object> lockManager = new RWOLockManager<CDOSessionImpl, Object>(); + private IRWOLockManager<CDOSessionImpl, Object> lockManager = new RWOLockManager<CDOSessionImpl, Object>(); @ExcludeFromDump private Set<CDOSessionImpl> singletonCollection = Collections.singleton(this); @@ -715,17 +717,48 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme public boolean waitForUpdate(long updateTime, long timeoutMillis) { long end = timeoutMillis == NO_TIMEOUT ? Long.MAX_VALUE : System.currentTimeMillis() + timeoutMillis; - for (CDOView view : getViews()) + InternalCDOView views[] = getViews(); + if (views.length > 0) { - long viewTimeoutMillis = timeoutMillis == NO_TIMEOUT ? NO_TIMEOUT : end - System.currentTimeMillis(); - boolean ok = view.waitForUpdate(updateTime, viewTimeoutMillis); - if (!ok) + for (CDOView view : views) { - return false; + long viewTimeoutMillis = timeoutMillis == NO_TIMEOUT ? NO_TIMEOUT : end - System.currentTimeMillis(); + boolean ok = view.waitForUpdate(updateTime, viewTimeoutMillis); + if (!ok) + { + return false; + } } + + return true; } - return true; + // Session without views + for (;;) + { + synchronized (lastUpdateTimeLock) + { + if (lastUpdateTime >= updateTime) + { + return true; + } + + long now = System.currentTimeMillis(); + if (now >= end) + { + return false; + } + + try + { + lastUpdateTimeLock.wait(end - now); + } + catch (InterruptedException ex) + { + throw WrappedException.wrap(ex); + } + } + } } /** @@ -803,6 +836,14 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme } } + public void handleLockNotification(CDOLockChangeInfo lockChangeInfo) + { + for (InternalCDOView view : getViews()) + { + view.handleLockNotification(lockChangeInfo); + } + } + private void registerPackageUnits(List<CDOPackageUnit> packageUnits) { InternalCDOPackageRegistry packageRegistry = getPackageRegistry(); |