From 62cc4e2d56feca8f2fde72bd64eea057530df0ab Mon Sep 17 00:00:00 2001 From: "evjava@almworks.com" Date: Wed, 22 Oct 2014 19:55:24 +0000 Subject: [PATCH 1/5] to fix bug From f1d17f6645b3fe4d0de0bac951c433825983abef Mon Sep 17 00:00:00 2001 From: "evjava@almworks.com" Date: Wed, 22 Oct 2014 19:57:32 +0000 Subject: [PATCH 2/5] added finalizing intarrays --- .../almworks/sqlite4java/SQLiteConnection.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/java/com/almworks/sqlite4java/SQLiteConnection.java b/java/com/almworks/sqlite4java/SQLiteConnection.java index a483c39..dc95253 100644 --- a/java/com/almworks/sqlite4java/SQLiteConnection.java +++ b/java/com/almworks/sqlite4java/SQLiteConnection.java @@ -27,7 +27,6 @@ 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 +435,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 +1165,21 @@ private void finalizeStatements() { } } + private void finalizeArrays() { + boolean alienThread = myConfinement != Thread.currentThread(); + if (!alienThread) { + for (Map.Entry entry : myLongArrays.entrySet()) { + String name = entry.getKey(); + SWIGTYPE_p_intarray array = entry.getValue(); + + int rc = _SQLiteManual.sqlite3_intarray_destroy(array); + if (rc != SQLITE_OK) { + Internal.logWarn(this, "error [" + rc + "] finalizing array " + name); + } + } + } + } + private void finalizeBlobs() { boolean alienThread = myConfinement != Thread.currentThread(); if (!alienThread) { From 29e537c92616671748c3b5b3375b50a0aea77ee7 Mon Sep 17 00:00:00 2001 From: "evjava@almworks.com" Date: Thu, 23 Oct 2014 10:08:02 +0000 Subject: [PATCH 3/5] fixed and rewrited #finalizeArrays with paranoia-mode. --- .../sqlite4java/SQLiteConnection.java | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/java/com/almworks/sqlite4java/SQLiteConnection.java b/java/com/almworks/sqlite4java/SQLiteConnection.java index dc95253..56e5494 100644 --- a/java/com/almworks/sqlite4java/SQLiteConnection.java +++ b/java/com/almworks/sqlite4java/SQLiteConnection.java @@ -20,10 +20,7 @@ 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.*; @@ -1168,16 +1165,32 @@ private void finalizeStatements() { private void finalizeArrays() { boolean alienThread = myConfinement != Thread.currentThread(); if (!alienThread) { - for (Map.Entry entry : myLongArrays.entrySet()) { - String name = entry.getKey(); - SWIGTYPE_p_intarray array = entry.getValue(); - - int rc = _SQLiteManual.sqlite3_intarray_destroy(array); - if (rc != SQLITE_OK) { - Internal.logWarn(this, "error [" + rc + "] finalizing array " + name); + Internal.logFine(this, "finalizing arrays"); + if (!myLongArrays.isEmpty()) { + int size = myLongArrays.size(); + List handles = new ArrayList(size); + List names = new ArrayList(size); + synchronized (myLock) { + handles.addAll(myLongArrays.values()); + names.addAll(myLongArrays.keySet()); + } + assert handles.size() == names.size(); + for (int i = 0; i < handles.size(); i++) { + finalizeArrayHandle(handles.get(i), names.get(i)); } } } + 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() { @@ -1234,9 +1247,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); } } From 469e8babe9d89129100bd9426b8b90e26c435717 Mon Sep 17 00:00:00 2001 From: "evjava@almworks.com" Date: Fri, 24 Oct 2014 14:13:16 +0000 Subject: [PATCH 4/5] fixed #finalizeArrays --- .../almworks/sqlite4java/SQLiteConnection.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/java/com/almworks/sqlite4java/SQLiteConnection.java b/java/com/almworks/sqlite4java/SQLiteConnection.java index 56e5494..a87c543 100644 --- a/java/com/almworks/sqlite4java/SQLiteConnection.java +++ b/java/com/almworks/sqlite4java/SQLiteConnection.java @@ -1166,17 +1166,16 @@ private void finalizeArrays() { boolean alienThread = myConfinement != Thread.currentThread(); if (!alienThread) { Internal.logFine(this, "finalizing arrays"); - if (!myLongArrays.isEmpty()) { - int size = myLongArrays.size(); - List handles = new ArrayList(size); - List names = new ArrayList(size); + FastMap fastMap; + while (true) { synchronized (myLock) { - handles.addAll(myLongArrays.values()); - names.addAll(myLongArrays.keySet()); + if (myLongArrays.isEmpty()) + break; + fastMap = new FastMap(myLongArrays); + myLongArrays.clear(); } - assert handles.size() == names.size(); - for (int i = 0; i < handles.size(); i++) { - finalizeArrayHandle(handles.get(i), names.get(i)); + for (Map.Entry entry : fastMap.entrySet()) { + finalizeArrayHandle(entry.getValue(), entry.getKey()); } } } From ab258be136ea70221ea11f1a3bae4bf8f993932a Mon Sep 17 00:00:00 2001 From: "evjava@almworks.com" Date: Mon, 27 Oct 2014 14:45:03 +0000 Subject: [PATCH 5/5] fixed build.gant --- ant/build.gant | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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,") } } }