#51505: CachedPages are now properly cleaned when a storage is unmounted. BLD200411171900
authormmatula@netbeans.org
Tue, 16 Nov 2004 15:54:57 +0000
changeset 16231b0701a7de2c
parent 1622 9c6ef29581c9
child 1624 627c65c6bdfa
#51505: CachedPages are now properly cleaned when a storage is unmounted.
mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/FileCache.java
mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/IntrusiveList.java
     1.1 --- a/mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/FileCache.java	Mon Nov 15 10:03:28 2004 +0000
     1.2 +++ b/mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/FileCache.java	Tue Nov 16 15:54:57 2004 +0000
     1.3 @@ -228,6 +228,28 @@
     1.4      */
     1.5      public synchronized void close() throws StorageException {
     1.6          commit();
     1.7 +
     1.8 +        // reInit or remove all pages used by this FileCache
     1.9 +        Iterator itr = pages.iterator();
    1.10 +        while (itr.hasNext()) {
    1.11 +            CachedPage page = (CachedPage)itr.next();
    1.12 +            if (page.getOwner() == this) {
    1.13 +                if (pages.size() > BtreeDatabase.FILE_CACHE_SIZE) {
    1.14 +                    itr.remove();
    1.15 +                    freePages.remove(page);
    1.16 +                } else {
    1.17 +                    freePages.addLast(page);
    1.18 +                    page.reInit(null, null);
    1.19 +                }
    1.20 +            }
    1.21 +        }
    1.22 +        for (Iterator it = pageHash.keySet().iterator(); it.hasNext();) {
    1.23 +            HashKey entry = (HashKey) it.next();
    1.24 +            if (entry.owner == this) {
    1.25 +                it.remove();
    1.26 +            }
    1.27 +        }
    1.28 +
    1.29          closeFiles();
    1.30      }
    1.31  
     2.1 --- a/mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/IntrusiveList.java	Mon Nov 15 10:03:28 2004 +0000
     2.2 +++ b/mdr/src/org/netbeans/mdr/persistence/btreeimpl/btreestorage/IntrusiveList.java	Tue Nov 16 15:54:57 2004 +0000
     2.3 @@ -54,13 +54,14 @@
     2.4  
     2.5      /** remove an object from the list */
     2.6      public void remove(Member m) {
     2.7 -	checkOwner(m);
     2.8 -        m.previous.next = m.next;
     2.9 -        m.next.previous = m.previous;
    2.10 -        m.previous = m.next = null;
    2.11 -	m.owner = null;
    2.12 -	mySize--;
    2.13 -	modLevel++;
    2.14 +	if (checkOwner(m)) {
    2.15 +            m.previous.next = m.next;
    2.16 +            m.next.previous = m.previous;
    2.17 +            m.previous = m.next = null;
    2.18 +            m.owner = null;
    2.19 +            mySize--;
    2.20 +            modLevel++;
    2.21 +        }
    2.22      }
    2.23  
    2.24      /** remove the object at the head of the list */
    2.25 @@ -93,29 +94,29 @@
    2.26  
    2.27      /* Add after aother element */
    2.28      private void addAfter(Member toAdd, Member afterMe) {
    2.29 -    	checkUnowned(toAdd);
    2.30 -	toAdd.next = afterMe.next;
    2.31 -	toAdd.previous = afterMe;
    2.32 -	toAdd.next.previous = toAdd;
    2.33 -	toAdd.previous.next = toAdd;
    2.34 -	toAdd.owner = this;
    2.35 -	mySize++;
    2.36 -	modLevel++;
    2.37 +    	if (checkUnowned(toAdd)) {
    2.38 +            toAdd.next = afterMe.next;
    2.39 +            toAdd.previous = afterMe;
    2.40 +            toAdd.next.previous = toAdd;
    2.41 +            toAdd.previous.next = toAdd;
    2.42 +            toAdd.owner = this;
    2.43 +            mySize++;
    2.44 +            modLevel++;
    2.45 +        }
    2.46      }
    2.47  
    2.48      /* Check that the object is a member of this list */
    2.49 -    private void checkOwner(Member m) {
    2.50 -    	if (m.owner != this) {
    2.51 -	    throw new IllegalArgumentException (
    2.52 -	    	"The object is not a member of the list!");
    2.53 -	}
    2.54 +    private boolean checkOwner(Member m) {
    2.55 +        return m.owner == this;
    2.56      }
    2.57  
    2.58 -    private void checkUnowned(Member m) {
    2.59 +    private boolean checkUnowned(Member m) {
    2.60      	if (m.owner != null) {
    2.61 -	    throw new IllegalArgumentException (
    2.62 -	    	"The object is already a member of some list!");
    2.63 +            if (m.owner == this) return false;
    2.64 +            throw new IllegalArgumentException (
    2.65 +                "The object is already a member of some list!");
    2.66  	}
    2.67 +        return true;
    2.68      }
    2.69  
    2.70      /** This class is an iterator over IntrusiveLists, returned by