summaryrefslogtreecommitdiff
path: root/java/src/Freeze/Map.java
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2008-12-18 14:32:27 +0100
committerJose <jose@zeroc.com>2008-12-18 14:32:27 +0100
commit57a0a4333fbb0b41cd7423b37b59534455a3173b (patch)
tree174b28cf580405b213ae4da8fd96b2ca509bd9aa /java/src/Freeze/Map.java
parentMerge branch 'R3_3_branch'; commit 'origin/R3_3_branch' into R3_3_branch (diff)
downloadice-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.java76
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);
}
//