diff options
author | Bernard Normier <bernard@zeroc.com> | 2004-04-19 20:56:03 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2004-04-19 20:56:03 +0000 |
commit | 561956e7595873480596a59314a6e526f7422cd1 (patch) | |
tree | bebc933d592673f53ed5a2af42b07c2096039204 /java/src | |
parent | Added keep, keepFacet, remove and removeFacet to Evictor; implemented (diff) | |
download | ice-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.java | 1 | ||||
-rw-r--r-- | java/src/Freeze/EvictorI.java | 224 | ||||
-rw-r--r-- | java/src/IceUtil/CountDownLatch.java | 5 |
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; } |