diff --git a/ant/build.gant b/ant/build.gant index 37a7c5e..7f6cdc1 100644 --- a/ant/build.gant +++ b/ant/build.gant @@ -447,11 +447,12 @@ final def osgi = { curDir, deliverDir, targetDir -> attribute(name:"Bundle-RequiredExecutionEnvironment", value:"JavaSE-1.6") attribute(name:"Export-Package", value:"com.almworks.sqlite4java;version=\"1.0.${version}\"") attribute(name:"Bundle-NativeCode", value: - "native/sqlite4java-win32-x64.dll; osname=win32; processor=x64," + + "native/sqlite4java-win32-x64.dll; osname=win32; processor=x86_64," + "native/sqlite4java-win32-x86.dll; osname=win32; processor=x86," + - "native/libsqlite4java-linux-amd64.so; osname=Linux; processor=x64," + - "native/libsqlite4java-linux-i386.so; osname=Linux; processor=x86," + - "native/libsqlite4java-osx.dylib; osname=Mac OS X; processor=x86_64") + "native/libsqlite4java-linux-amd64.so; osname=linux; processor=x64," + + "native/libsqlite4java-linux-i386.so; osname=linux; processor=x86," + + "native/libsqlite4java-osx.dylib; osname=macosx; processor=x86_64," + + "native/libsqlite4java-osx.dylib; osname=macosx; processor=x86,") } } } diff --git a/java/com/almworks/sqlite4java/SQLiteConnection.java b/java/com/almworks/sqlite4java/SQLiteConnection.java index a483c39..a87c543 100644 --- a/java/com/almworks/sqlite4java/SQLiteConnection.java +++ b/java/com/almworks/sqlite4java/SQLiteConnection.java @@ -20,14 +20,10 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.logging.Level; import static com.almworks.sqlite4java.SQLiteConstants.*; -import com.almworks.sqlite4java.SQLiteColumnMetadata; /** * SQLiteConnection is a single connection to sqlite database. It wraps the sqlite3* @@ -436,6 +432,7 @@ public void dispose() { finalizeStatements(); finalizeBlobs(); finalizeBuffers(); + finalizeArrays(); finalizeProgressHandler(handle); int rc = _SQLiteSwigged.sqlite3_close(handle); // rc may be SQLiteConstants.Result.SQLITE_BUSY if statements are open @@ -1165,6 +1162,36 @@ private void finalizeStatements() { } } + private void finalizeArrays() { + boolean alienThread = myConfinement != Thread.currentThread(); + if (!alienThread) { + Internal.logFine(this, "finalizing arrays"); + FastMap fastMap; + while (true) { + synchronized (myLock) { + if (myLongArrays.isEmpty()) + break; + fastMap = new FastMap(myLongArrays); + myLongArrays.clear(); + } + for (Map.Entry entry : fastMap.entrySet()) { + finalizeArrayHandle(entry.getValue(), entry.getKey()); + } + } + } + synchronized (myLock) { + if (!myLongArrays.isEmpty()) { + int count = myLongArrays.size(); + if (alienThread) { + Internal.logWarn(this, "cannot finalize " + count + " arrays from alien thread"); + } else { + Internal.recoverableError(this, count + " arrays are not finalized", false); + } + myLongArrays.clear(); + } + } + } + private void finalizeBlobs() { boolean alienThread = myConfinement != Thread.currentThread(); if (!alienThread) { @@ -1219,9 +1246,13 @@ private void finalizeArray(SQLiteLongArray array) { Internal.logFine(array, "finalizing"); SWIGTYPE_p_intarray handle = array.arrayHandle(); String tableName = array.getName(); + finalizeArrayHandle(handle, tableName); + } + + private void finalizeArrayHandle(SWIGTYPE_p_intarray handle, String name) { int rc = _SQLiteManual.sqlite3_intarray_destroy(handle); if (rc != SQLITE_OK) { - Internal.logWarn(this, "error [" + rc + "] finalizing array " + tableName); + Internal.logWarn(this, "error [" + rc + "] finalizing array " + name); } }