summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2004-04-19 20:56:03 +0000
committerBernard Normier <bernard@zeroc.com>2004-04-19 20:56:03 +0000
commit561956e7595873480596a59314a6e526f7422cd1 (patch)
treebebc933d592673f53ed5a2af42b07c2096039204 /java/src
parentAdded keep, keepFacet, remove and removeFacet to Evictor; implemented (diff)
downloadice-561956e7595873480596a59314a6e526f7422cd1.tar.bz2
ice-561956e7595873480596a59314a6e526f7422cd1.tar.xz
ice-561956e7595873480596a59314a6e526f7422cd1.zip
Added keep, keepFacet, remove and removeFacet to Evictor; bug fixes
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Freeze/EvictorElement.java1
-rw-r--r--java/src/Freeze/EvictorI.java224
-rw-r--r--java/src/IceUtil/CountDownLatch.java5
3 files changed, 209 insertions, 21 deletions
diff --git a/java/src/Freeze/EvictorElement.java b/java/src/Freeze/EvictorElement.java
index c5495dc7264..a687c271917 100644
--- a/java/src/Freeze/EvictorElement.java
+++ b/java/src/Freeze/EvictorElement.java
@@ -57,6 +57,7 @@ class EvictorElement extends Ice.LocalObjectImpl
//
java.util.Iterator evictPosition = null;
int usageCount = -1;
+ int keepCount = 0;
boolean stale = false;
//
diff --git a/java/src/Freeze/EvictorI.java b/java/src/Freeze/EvictorI.java
index c12791ce961..764fb58c3b7 100644
--- a/java/src/Freeze/EvictorI.java
+++ b/java/src/Freeze/EvictorI.java
@@ -602,6 +602,25 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
}
}
}
+
+ if(element. keepCount > 0)
+ {
+ assert notThere == false;
+
+ element.keepCount = 0;
+ //
+ // Add to front of evictor queue
+ //
+ // Note that save evicts dead objects
+ //
+ _evictorList.addFirst(element);
+ element.evictPosition = _evictorList.iterator();
+ //
+ // Position the iterator "on" the element.
+ //
+ element.evictPosition.next();
+ _currentEvictorSize++;
+ }
}
}
break; // for(;;)
@@ -654,6 +673,167 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
}
}
+
+ public void
+ keep(Ice.Identity ident)
+ {
+ keepFacet(ident, "");
+ }
+
+ public void
+ keepFacet(Ice.Identity ident, String facet)
+ {
+ boolean notThere = false;
+
+ ObjectStore store = findStore(facet);
+ if(store == null)
+ {
+ notThere = true;
+ }
+ else
+ {
+ for(;;)
+ {
+ EvictorElement element = (EvictorElement) store.cache().pin(ident);
+ if(element == null)
+ {
+ notThere = true;
+ break;
+ }
+
+ synchronized(this)
+ {
+
+ if(_deactivated)
+ {
+ throw new EvictorDeactivatedException();
+ }
+
+ if(element.stale)
+ {
+ //
+ // try again
+ //
+ continue;
+ }
+
+ synchronized(element)
+ {
+ if(element.status == EvictorElement.destroyed || element.status == EvictorElement.dead)
+ {
+ notThere = true;
+ break;
+ }
+ }
+
+ //
+ // Found!
+ //
+
+ if(element.keepCount == 0)
+ {
+ if(element.usageCount < 0)
+ {
+ //
+ // New object
+ //
+ element.usageCount = 0;
+ }
+ else
+ {
+ assert element.evictPosition != null;
+ element.evictPosition.remove();
+ element.evictPosition = null;
+ _currentEvictorSize--;
+ }
+ element.keepCount = 1;
+ }
+ else
+ {
+ element.keepCount++;
+ }
+ break;
+ }
+ }
+ }
+
+ if(notThere)
+ {
+ Ice.NotRegisteredException ex = new Ice.NotRegisteredException();
+ ex.kindOfObject = "servant";
+ ex.id = Ice.Util.identityToString(ident);
+ if(facet.length() != 0)
+ {
+ ex.id += " -f " + facet;
+ }
+ throw ex;
+ }
+ }
+
+ public void
+ release(Ice.Identity ident)
+ {
+ releaseFacet(ident, "");
+ }
+
+ public void
+ releaseFacet(Ice.Identity ident, String facet)
+ {
+ synchronized(this)
+ {
+ if(_deactivated)
+ {
+ throw new EvictorDeactivatedException();
+ }
+
+ ObjectStore store = (ObjectStore) _storeMap.get(facet);
+
+ if(store != null)
+ {
+
+ EvictorElement element = (EvictorElement) store.cache().getIfPinned(ident);
+ if(element != null)
+ {
+ assert !element.stale;
+ if(element.keepCount > 0)
+ {
+ if(--element.keepCount == 0)
+ {
+ //
+ // Add to front of evictor queue
+ //
+ // Note that the element cannot be destroyed or dead since
+ // its keepCount was > 0.
+ //
+ assert element.evictPosition == null;
+ _evictorList.addFirst(element);
+ element.evictPosition = _evictorList.iterator();
+ //
+ // Position the iterator "on" the element.
+ //
+ element.evictPosition.next();
+ _currentEvictorSize++;
+ }
+ //
+ // Success
+ //
+ return;
+ }
+ }
+ }
+ }
+
+ Ice.NotRegisteredException ex = new Ice.NotRegisteredException();
+ ex.kindOfObject = "servant";
+ ex.id = Ice.Util.identityToString(ident);
+ if(facet.length() != 0)
+ {
+ ex.id += " -f " + facet;
+ }
+ throw ex;
+ }
+
+
public EvictorIterator
getIterator(String facet, int batchSize)
{
@@ -883,7 +1063,7 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
{
addToModifiedQueue(element);
}
- else
+ else if(element.usageCount == 0 && element.keepCount == 0)
{
//
// Evict as many elements as necessary.
@@ -1254,7 +1434,7 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
while(p.hasNext())
{
EvictorElement element = (EvictorElement) p.next();
- if(element.usageCount == 0)
+ if(element.usageCount == 0 && element.keepCount == 0)
{
//
// Get rid of unused dead elements
@@ -1376,6 +1556,7 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
//
assert !element.stale;
+ assert element.keepCount == 0;
if(_trace >= 2 || (_trace >= 1 && _evictorList.size() % 50 == 0))
{
@@ -1410,27 +1591,31 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
assert Thread.holdsLock(this);
assert !element.stale;
- if(element.usageCount < 0)
- {
- assert element.evictPosition == null;
+ if(element.keepCount == 0)
+ {
+ if(element.usageCount < 0)
+ {
+ assert element.evictPosition == null;
+
+ //
+ // New object
+ //
+ element.usageCount = 0;
+ _currentEvictorSize++;
+ }
+ else
+ {
+ assert element.evictPosition != null;
+ element.evictPosition.remove();
+ }
+ _evictorList.addFirst(element);
+ element.evictPosition = _evictorList.iterator();
//
- // New object
+ // Position the iterator "on" the element.
//
- element.usageCount = 0;
- _currentEvictorSize++;
- }
- else
- {
- assert element.evictPosition != null;
- element.evictPosition.remove();
+ element.evictPosition.next();
}
- _evictorList.addFirst(element);
- element.evictPosition = _evictorList.iterator();
- //
- // Position the iterator "on" the element.
- //
- element.evictPosition.next();
}
private void
@@ -1439,6 +1624,7 @@ class EvictorI extends Ice.LocalObjectImpl implements Evictor, Runnable
assert Thread.holdsLock(this);
assert !element.stale;
+ assert element.keepCount == 0;
element.evictPosition.remove();
_currentEvictorSize--;
diff --git a/java/src/IceUtil/CountDownLatch.java b/java/src/IceUtil/CountDownLatch.java
index 88e6719a102..564024e444b 100644
--- a/java/src/IceUtil/CountDownLatch.java
+++ b/java/src/IceUtil/CountDownLatch.java
@@ -26,6 +26,7 @@ public class CountDownLatch
{
throw new IllegalArgumentException();
}
+ _count = count;
}
public synchronized void
@@ -40,7 +41,7 @@ public class CountDownLatch
public synchronized void
countDown()
{
- if(--_count == 0)
+ if(_count > 0 && --_count == 0)
{
notifyAll();
}
@@ -52,5 +53,5 @@ public class CountDownLatch
return _count;
}
- private long _count;
+ private int _count;
}