#51505: CachedPages are now properly cleaned when a storage is unmounted.
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