diff options
author | Jose <jose@zeroc.com> | 2008-12-18 14:32:27 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2008-12-18 14:32:27 +0100 |
commit | 57a0a4333fbb0b41cd7423b37b59534455a3173b (patch) | |
tree | 174b28cf580405b213ae4da8fd96b2ca509bd9aa /java/src/Freeze/Map.java | |
parent | Merge branch 'R3_3_branch'; commit 'origin/R3_3_branch' into R3_3_branch (diff) | |
download | ice-57a0a4333fbb0b41cd7423b37b59534455a3173b.tar.bz2 ice-57a0a4333fbb0b41cd7423b37b59534455a3173b.tar.xz ice-57a0a4333fbb0b41cd7423b37b59534455a3173b.zip |
Revert "Remove Java finalizers code"
This reverts commit 94e1da6dc82a8ed38ee7a5691d691d375aaa28cb.
Diffstat (limited to 'java/src/Freeze/Map.java')
-rw-r--r-- | java/src/Freeze/Map.java | 76 |
1 files changed, 59 insertions, 17 deletions
diff --git a/java/src/Freeze/Map.java b/java/src/Freeze/Map.java index 6b9ce2ab8b7..b2ad20012c0 100644 --- a/java/src/Freeze/Map.java +++ b/java/src/Freeze/Map.java @@ -281,9 +281,15 @@ public abstract class Map extends java.util.AbstractMap } public void + close() + { + close(false); + } + + public void closeDb() { - close(); + close(false); _connection.dbEnv().removeSharedMapDb(_dbName); } @@ -837,7 +843,7 @@ public abstract class Map extends java.util.AbstractMap public void closeAllIterators() { - closeAllIteratorsExcept(null); + closeAllIteratorsExcept(null, false); } @@ -957,7 +963,7 @@ public abstract class Map extends java.util.AbstractMap void - closeAllIteratorsExcept(Object except) + closeAllIteratorsExcept(Object except, boolean finalizing) { synchronized(_iteratorList) { @@ -968,29 +974,38 @@ public abstract class Map extends java.util.AbstractMap Object obj = p.next(); if(obj != except) { - ((EntryIteratorImpl)obj).close(); + ((EntryIteratorImpl)obj).close(finalizing); } } } } + protected void + finalize() + { + close(true); + } + // // The synchronization is only needed when finalizing is true // - public void - close() + void + close(boolean finalizing) { - if(_db != null) + synchronized(_connection) { - try - { - closeAllIteratorsExcept(null); - } - finally + if(_db != null) { - _db = null; - _connection.unregisterMap(_token); - _token = null; + try + { + closeAllIteratorsExcept(null, finalizing); + } + finally + { + _db = null; + _connection.unregisterMap(_token); + _token = null; + } } } } @@ -1920,7 +1935,7 @@ public abstract class Map extends java.util.AbstractMap { if(_txn != null) { - closeAllIteratorsExcept(this); + closeAllIteratorsExcept(this, false); } // @@ -2019,9 +2034,30 @@ public abstract class Map extends java.util.AbstractMap } } + // + // Extra operations. + // public void close() { + close(false); + } + + // + // The synchronized is needed because this method can be called + // concurrently by Connection, Map and Map.EntryIterator finalizers. + // + synchronized void + close(boolean finalizing) + { + if(finalizing && (_cursor != null || _txn != null) && _connection.closeInFinalizeWarning()) + { + _connection.communicator().getLogger().warning( + "finalize() closing a live iterator on Map \"" + _db.dbName() + "\"; the application " + + "should have closed it earlier by calling Map.EntryIterator.close(), " + + "Map.closeAllIterators(), Map.close(), Connection.close(), or (if also " + + "leaking a transaction) Transaction.commit() or Transaction.rollback()"); + } if(_iteratorListToken != null) { @@ -2102,6 +2138,12 @@ public abstract class Map extends java.util.AbstractMap close(); } + protected void + finalize() + { + close(true); + } + void setValue(Map.Entry entry, Object value) { @@ -2113,7 +2155,7 @@ public abstract class Map extends java.util.AbstractMap if(_txn != null) { - closeAllIteratorsExcept(this); + closeAllIteratorsExcept(this, false); } // |