[Git][java-team/jffi][master] 8 commits: New upstream version 1.3.12+ds
Jérôme Charaoui (@lavamind)
gitlab at salsa.debian.org
Tue Feb 20 01:11:01 GMT 2024
Jérôme Charaoui pushed to branch master at Debian Java Maintainers / jffi
Commits:
4d8e843a by Jérôme Charaoui at 2023-10-26T09:10:47-04:00
New upstream version 1.3.12+ds
- - - - -
825fb01c by Jérôme Charaoui at 2024-02-19T18:59:43-05:00
d/copyright: update Files-Excluded patterns
- - - - -
28cba2bc by Jérôme Charaoui at 2024-02-19T19:00:12-05:00
New upstream version 1.3.13+ds
- - - - -
200da114 by Jérôme Charaoui at 2024-02-19T19:00:14-05:00
Update upstream source from tag 'upstream/1.3.13+ds'
Update to upstream version '1.3.13+ds'
with Debian dir efb83039d7cdd2b08430214394702cb089a8328e
- - - - -
ceec23e6 by Jérôme Charaoui at 2024-02-19T19:01:21-05:00
d/patches: refresh for new upstream version
- - - - -
2d787193 by Jérôme Charaoui at 2024-02-19T19:03:21-05:00
remove obsolete README.Debian-source
- - - - -
507b86e2 by Jérôme Charaoui at 2024-02-19T19:07:41-05:00
d/control: update build-dep pkg-config to pkgconf
- - - - -
bdfaa394 by Jérôme Charaoui at 2024-02-19T19:07:42-05:00
Update changelog for 1.3.13+ds-1 release
- - - - -
21 changed files:
- .github/build-native-debian.sh
- .github/workflows/native-linux.yml
- − debian/README.Debian-source
- debian/changelog
- debian/control
- debian/copyright
- debian/patches/0009-optimize-build-targets.patch
- debian/patches/0010-output-test-results-to-console-instead-of-file.patch
- debian/patches/disable-warnings-as-errors-for-jni.patch
- debian/patches/disable-warnings-as-errors-for-libtest.patch
- debian/patches/junit_path_for_tests.patch
- debian/patches/nonlinux-platforms.patch
- jni/GNUmakefile
- pom.xml
- src/main/java/com/kenai/jffi/Aggregate.java
- src/main/java/com/kenai/jffi/CallContext.java
- src/main/java/com/kenai/jffi/ClosureMagazine.java
- src/main/java/com/kenai/jffi/ClosurePool.java
- src/main/java/com/kenai/jffi/Library.java
- src/main/java/com/kenai/jffi/NativeMethods.java
- + src/main/java/com/kenai/jffi/internal/Cleaner.java
Changes:
=====================================
.github/build-native-debian.sh
=====================================
@@ -5,13 +5,21 @@ set -ex
cd "$(dirname "$(dirname "$0")")"
# Add stretch for Java 8
-cat <<END > /etc/apt/sources.list.d/stretch.list
-deb http://deb.debian.org/debian stretch main
-deb http://security.debian.org/debian-security stretch/updates main
-END
+#cat <<END > /etc/apt/sources.list.d/stretch.list
+#deb http://deb.debian.org/debian stretch main
+#deb http://security.debian.org/debian-security stretch/updates main
+#END
apt-get update -y
-apt-get install -y --no-install-recommends openjdk-8-jdk-headless make gcc libc6-dev texinfo
+
+apt-get install -y wget apt-transport-https gpg
+wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null
+echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
+
+apt-get update -y
+
+apt-get install -y temurin-8-jdk
+apt-get install -y --no-install-recommends make gcc libc6-dev texinfo
# Needs to be split, otherwise a newer version of OpenJDK is pulled
apt-get install -y --no-install-recommends ant
rm archive/*
=====================================
.github/workflows/native-linux.yml
=====================================
@@ -48,9 +48,9 @@ jobs:
- name: Restart Docker
run: sudo systemctl restart docker.service
- name: Pull docker image
- run: docker pull --platform $(echo ${{ matrix.arch }} | sed 's|-|/|g') debian:8 || true
+ run: docker pull --platform $(echo ${{ matrix.arch }} | sed 's|-|/|g') debian:10 || true
- name: Build inside Docker
- run: docker run --rm -v $GITHUB_WORKSPACE:/work debian:8 /work/.github/build-native-debian.sh
+ run: docker run --rm -v $GITHUB_WORKSPACE:/work debian:10 /work/.github/build-native-debian.sh
- name: Archive built library
uses: actions/upload-artifact at v2
with:
=====================================
debian/README.Debian-source deleted
=====================================
@@ -1,8 +0,0 @@
-jffi
-====
-
-Use the rules/get-orig-source target to create the orig.tar.xz.
-For more details on repackaging of upstream sources please see the
-debian/repack-tar.sh file.
-
- -- tony mancill <tmancill at debian.org> Sun, 25 Jan 2015 21:40:01 -0800
=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+jffi (1.3.13+ds-1) unstable; urgency=medium
+
+ * New upstream version 1.3.13+ds
+ * d/copyright: update Files-Excluded patterns
+ * d/patches: refresh for new upstream version
+ * remove obsolete README.Debian-source
+
+ -- Jérôme Charaoui <jerome at riseup.net> Mon, 19 Feb 2024 19:04:05 -0500
+
jffi (1.3.12+ds-1) unstable; urgency=medium
* Team upload.
=====================================
debian/control
=====================================
@@ -15,7 +15,7 @@ Build-Depends:
libffi-dev,
libltdl-dev,
maven-debian-helper (>= 2.6.4),
- pkg-config,
+ pkgconf,
Build-Depends-Indep:
bnd (>= 2.1.0),
libmaven-antrun-plugin-java,
=====================================
debian/copyright
=====================================
@@ -2,7 +2,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: jffi
Upstream-Contact: Wayne Meissner
Source: http://github.com/jnr/jffi
-Files-Excluded: .git *.jar *.zip */libffi/* */win32/*
+Files-Excluded: *.jar *.zip jni/libffi
Files: *
Copyright: 2010 Wayne Meissner
=====================================
debian/patches/0009-optimize-build-targets.patch
=====================================
@@ -13,10 +13,10 @@ Forwarded: not-needed
build.xml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
-diff --git a/build.xml b/build.xml
-index b871c75..7c8faaf 100644
---- a/build.xml
-+++ b/build.xml
+Index: jffi/build.xml
+===================================================================
+--- jffi.orig/build.xml
++++ jffi/build.xml
@@ -18,7 +18,7 @@
<delete dir="${dist.dir}"/>
</target>
@@ -26,7 +26,7 @@ index b871c75..7c8faaf 100644
<target name="build-native" depends="-init, -build-platform-jar"/>
-@@ -146,7 +146,7 @@
+@@ -156,7 +156,7 @@
<target name="-pre-jar"/>
<target name="-post-init" depends="-init-vars"/>
<target name="-pre-compile" depends="-init"/>
@@ -35,7 +35,7 @@ index b871c75..7c8faaf 100644
<target name="-pre-compile-test" depends="-init"/>
<target name="-post-compile-test" depends="-build-native-testlib"/>
<target name="-post-jar" depends="-assemble-final-jar"/>
-@@ -161,7 +161,7 @@
+@@ -171,7 +171,7 @@
<target name="compile" depends="-init,-pre-compile,-do-compile,-post-compile">
</target>
@@ -44,7 +44,7 @@ index b871c75..7c8faaf 100644
<mkdir dir="${dist.dir}"/>
<jar destfile="${dist.jar}" basedir="${build.classes.dir}" compress="true"/>
</target>
-@@ -345,7 +345,7 @@
+@@ -355,7 +355,7 @@
-->
</target>
@@ -53,7 +53,7 @@ index b871c75..7c8faaf 100644
<mkdir dir="${build.native.dir}"/>
<exec executable="cygpath" outputproperty="jni.GNUmakefile" osfamily="Windows">
-@@ -404,7 +404,7 @@
+@@ -414,7 +414,7 @@
</exec>
</target>
=====================================
debian/patches/0010-output-test-results-to-console-instead-of-file.patch
=====================================
@@ -7,11 +7,11 @@ Forwarded: not-needed
build.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
-diff --git a/build.xml b/build.xml
-index 7c8faaf..6605b72 100644
---- a/build.xml
-+++ b/build.xml
-@@ -180,7 +180,7 @@
+Index: jffi/build.xml
+===================================================================
+--- jffi.orig/build.xml
++++ jffi/build.xml
+@@ -190,7 +190,7 @@
</classpath>
<sysproperty key="java.library.path" value="${build.native.dir}"/>
@@ -20,7 +20,7 @@ index 7c8faaf..6605b72 100644
<batchtest todir="${build.test.dir}/results">
<fileset dir="${src.test.dir}">
<include name="**/*Test*.java"/>
-@@ -199,7 +199,7 @@
+@@ -209,7 +209,7 @@
<pathelement location="/usr/share/java/hamcrest-core.jar"/>
</classpath>
@@ -29,7 +29,7 @@ index 7c8faaf..6605b72 100644
<batchtest todir="${build.test.dir}/results">
<fileset dir="${src.test.dir}">
<include name="**/*Test*.java"/>
-@@ -219,7 +219,7 @@
+@@ -229,7 +229,7 @@
</classpath>
<sysproperty key="jffi.extract.name" value=""/>
=====================================
debian/patches/disable-warnings-as-errors-for-jni.patch
=====================================
@@ -12,11 +12,11 @@ software is a bit of a fairy tale really.
jni/GNUmakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
-diff --git a/jni/GNUmakefile b/jni/GNUmakefile
-index 8c44e83..5884afb 100755
---- a/jni/GNUmakefile
-+++ b/jni/GNUmakefile
-@@ -64,7 +64,7 @@ JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing -DNDEBUG
+Index: jffi/jni/GNUmakefile
+===================================================================
+--- jffi.orig/jni/GNUmakefile
++++ jffi/jni/GNUmakefile
+@@ -63,7 +63,7 @@ JFLAGS = -fno-omit-frame-pointer -fno-st
OFLAGS = -O2 $(JFLAGS)
# MacOS headers aren't completely warning free, so turn them off
=====================================
debian/patches/disable-warnings-as-errors-for-libtest.patch
=====================================
@@ -6,11 +6,11 @@ Subject: disable-warnings-as-errors-for-libtest
libtest/GNUmakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
-diff --git a/libtest/GNUmakefile b/libtest/GNUmakefile
-index 49da378..0a5e9a5 100644
---- a/libtest/GNUmakefile
-+++ b/libtest/GNUmakefile
-@@ -45,7 +45,7 @@ TEST_OBJS := $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRCS))
+Index: jffi/libtest/GNUmakefile
+===================================================================
+--- jffi.orig/libtest/GNUmakefile
++++ jffi/libtest/GNUmakefile
+@@ -44,7 +44,7 @@ TEST_OBJS := $(patsubst $(SRC_DIR)/%.c,
# http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of_1.html
JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing
OFLAGS = -O2 $(JFLAGS)
=====================================
debian/patches/junit_path_for_tests.patch
=====================================
@@ -9,10 +9,10 @@ Forwarded: not-needed
build.xml | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
-diff --git a/build.xml b/build.xml
-index f30c22e..bf5ac41 100644
---- a/build.xml
-+++ b/build.xml
+Index: jffi/build.xml
+===================================================================
+--- jffi.orig/build.xml
++++ jffi/build.xml
@@ -2,8 +2,8 @@
<project name="jffi" default="jar" basedir=".">
<description>Builds, tests, and runs the project jffi.</description>
@@ -24,7 +24,7 @@ index f30c22e..bf5ac41 100644
</path>
<target name="clean-java" depends="-init">
-@@ -168,8 +168,8 @@
+@@ -178,8 +178,8 @@
<classpath>
<pathelement location="${build.classes.dir}"/>
<pathelement location="${build.test.dir}/classes"/>
@@ -35,7 +35,7 @@ index f30c22e..bf5ac41 100644
</classpath>
<sysproperty key="java.library.path" value="${build.native.dir}"/>
-@@ -188,8 +188,8 @@
+@@ -198,8 +198,8 @@
<pathelement location="${build.classes.dir}"/>
<pathelement location="${build.test.dir}/classes"/>
<fileset dir="archive" includes="*.jar"/>
@@ -46,7 +46,7 @@ index f30c22e..bf5ac41 100644
</classpath>
<formatter type="plain" /> <!-- to file -->
-@@ -207,8 +207,8 @@
+@@ -217,8 +217,8 @@
<pathelement location="${build.classes.dir}"/>
<pathelement location="${build.test.dir}/classes"/>
<fileset dir="archive" includes="*.jar"/>
@@ -57,7 +57,7 @@ index f30c22e..bf5ac41 100644
</classpath>
<sysproperty key="jffi.extract.name" value=""/>
-@@ -231,8 +231,8 @@
+@@ -241,8 +241,8 @@
<classpath>
<pathelement location="${build.classes.dir}"/>
<pathelement location="${build.test.dir}/classes"/>
@@ -68,7 +68,7 @@ index f30c22e..bf5ac41 100644
</classpath>
<sysproperty key="java.library.path" value="${build.native.dir}"/>
<formatter type="plain" usefile="false"/>
-@@ -253,8 +253,8 @@
+@@ -263,8 +263,8 @@
<javac srcdir="${src.test.dir}" destdir="${build.test.dir}/classes" includeantruntime="false" classpathref="classpath.test">
<classpath>
<pathelement location="${build.classes.dir}"/>
=====================================
debian/patches/nonlinux-platforms.patch
=====================================
@@ -8,11 +8,11 @@ Bug-Debian: http://bugs.debian.org/808175
jni/jffi/endian.h | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
-diff --git a/build.xml b/build.xml
-index b163384..b871c75 100644
---- a/build.xml
-+++ b/build.xml
-@@ -92,6 +92,13 @@
+Index: jffi/build.xml
+===================================================================
+--- jffi.orig/build.xml
++++ jffi/build.xml
+@@ -102,6 +102,13 @@
<condition property="platform.os" value="Windows">
<os family="Windows"/>
</condition>
@@ -26,10 +26,10 @@ index b163384..b871c75 100644
<!-- default to os.arch for the cpu -->
<condition property="platform.cpu" value="${os.arch}">
<not><isset property="platform.cpu"/></not>
-diff --git a/jni/jffi/endian.h b/jni/jffi/endian.h
-index fa759df..e729be3 100644
---- a/jni/jffi/endian.h
-+++ b/jni/jffi/endian.h
+Index: jffi/jni/jffi/endian.h
+===================================================================
+--- jffi.orig/jni/jffi/endian.h
++++ jffi/jni/jffi/endian.h
@@ -36,7 +36,7 @@
#include <sys/param.h>
#include <sys/types.h>
=====================================
jni/GNUmakefile
=====================================
@@ -247,6 +247,9 @@ ifdef CONFIGURE_BUILD
LIBFFI_CONFIGURE += --build=$(CONFIGURE_BUILD)
endif
+# Disable memfd_create which binds us to newer glibc (jnr/jffi#138)
+LIBFFI_CONFIGURE += 'ac_cv_func_memfd_create=no'
+
all: $(LIBJFFI)
debug:
=====================================
pom.xml
=====================================
@@ -8,7 +8,7 @@
<groupId>com.github.jnr</groupId>
<artifactId>jffi</artifactId>
<packaging>jar</packaging>
- <version>1.3.12</version>
+ <version>1.3.13</version>
<name>jffi</name>
<description>Java Foreign Function Interface</description>
<url>http://github.com/jnr/jffi</url>
=====================================
src/main/java/com/kenai/jffi/Aggregate.java
=====================================
@@ -32,11 +32,14 @@
package com.kenai.jffi;
+import com.kenai.jffi.internal.Cleaner;
+
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class Aggregate extends Type {
+
private final TypeInfo typeInfo;
private final long handle;
private volatile int disposed;
@@ -54,26 +57,28 @@ public abstract class Aggregate extends Type {
this.foreign = foreign;
this.handle = handle;
this.typeInfo = new TypeInfo(handle, foreign.getTypeType(handle), foreign.getTypeSize(handle), foreign.getTypeAlign(handle));
+
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ int disposed = UPDATER.getAndSet(Aggregate.this, 1);
+ if (disposed == 0) {
+ foreign.freeAggregate(typeInfo.handle);
+ }
+ } catch (Throwable t) {
+ Logger.getLogger(getClass().getName()).log(Level.WARNING,
+ "Exception when freeing FFI aggregate: %s", t.getLocalizedMessage());
+ }
+ }
+ });
}
final TypeInfo getTypeInfo() {
return typeInfo;
}
+ @Deprecated
public synchronized final void dispose() {}
- @Override
- protected void finalize() throws Throwable {
- try {
- int disposed = UPDATER.getAndSet(this, 1);
- if (disposed == 0) {
- foreign.freeAggregate(typeInfo.handle);
- }
- } catch (Throwable t) {
- Logger.getLogger(getClass().getName()).log(Level.WARNING,
- "Exception when freeing FFI aggregate: %s", t.getLocalizedMessage());
- } finally {
- super.finalize();
- }
- }
}
=====================================
src/main/java/com/kenai/jffi/CallContext.java
=====================================
@@ -32,6 +32,8 @@
package com.kenai.jffi;
+import com.kenai.jffi.internal.Cleaner;
+
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.logging.Level;
@@ -44,6 +46,7 @@ import java.util.logging.Logger;
* native function, or to implement a callback from native code to java.
*/
public final class CallContext {
+
/** The native address of the context */
final long contextAddress;
@@ -160,6 +163,21 @@ public final class CallContext {
this.rawParameterSize = foreign.getCallContextRawParameterSize(h);
this.parameterTypeHandles = Type.nativeHandles(parameterTypes);
this.flags = flags;
+
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ int disposed = UPDATER.getAndSet(CallContext.this, 1);
+ if (disposed == 0 && contextAddress != 0) {
+ foreign.freeCallContext(contextAddress);
+ }
+ } catch (Throwable t) {
+ Logger.getLogger(getClass().getName()).log(Level.WARNING,
+ "exception when freeing " + getClass() + ": %s", t.getLocalizedMessage());
+ }
+ }
+ });
}
/**
@@ -237,18 +255,4 @@ public final class CallContext {
@Deprecated
public final void dispose() {}
- @Override
- protected void finalize() throws Throwable {
- try {
- int disposed = UPDATER.getAndSet(this, 1);
- if (disposed == 0 && contextAddress != 0) {
- foreign.freeCallContext(contextAddress);
- }
- } catch (Throwable t) {
- Logger.getLogger(getClass().getName()).log(Level.WARNING,
- "exception when freeing " + getClass() + ": %s", t.getLocalizedMessage());
- } finally {
- super.finalize();
- }
- }
}
=====================================
src/main/java/com/kenai/jffi/ClosureMagazine.java
=====================================
@@ -1,6 +1,7 @@
package com.kenai.jffi;
-import java.util.concurrent.atomic.AtomicBoolean;
+import com.kenai.jffi.internal.Cleaner;
+
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -9,6 +10,7 @@ import java.util.logging.Logger;
*
*/
public final class ClosureMagazine {
+
/** A handle to the foreign interface to keep it alive as long as this object is alive */
@SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
private final Foreign foreign;
@@ -23,6 +25,21 @@ public final class ClosureMagazine {
this.foreign = foreign;
this.callContext = callContext;
this.magazineAddress = magazineAddress;
+
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ int disposed = UPDATER.getAndSet(ClosureMagazine.this, 1);
+ if (magazineAddress != 0L && disposed == 0) {
+ foreign.freeClosureMagazine(magazineAddress);
+ }
+ } catch (Throwable t) {
+ Logger.getLogger(getClass().getName()).log(Level.WARNING,
+ "exception when freeing " + getClass() + ": %s", t.getLocalizedMessage());
+ }
+ }
+ });
}
public Closure.Handle allocate(Object proxy) {
@@ -60,19 +77,4 @@ public final class ClosureMagazine {
public void free() {}
}
- @Override
- protected void finalize() throws Throwable {
- try {
- int disposed = UPDATER.getAndSet(this, 1);
- if (magazineAddress != 0L && disposed == 0) {
- foreign.freeClosureMagazine(magazineAddress);
- }
- } catch (Throwable t) {
- Logger.getLogger(getClass().getName()).log(Level.WARNING,
- "exception when freeing " + getClass() + ": %s", t.getLocalizedMessage());
- } finally {
- super.finalize();
- }
- }
-
}
=====================================
src/main/java/com/kenai/jffi/ClosurePool.java
=====================================
@@ -32,6 +32,8 @@
package com.kenai.jffi;
+import com.kenai.jffi.internal.Cleaner;
+
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -193,6 +195,27 @@ public final class ClosurePool {
slots.toArray(this.slots);
next = 0;
freeCount = this.slots.length;
+
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ boolean release = true;
+ //
+ // If any of the closures allocated from this magazine set autorelease=false
+ // then this magazine cannot be freed, so just let it leak
+ //
+ for (int i = 0; i < Magazine.this.slots.length; i++) {
+ if (!Magazine.this.slots[i].autorelease) {
+ release = false;
+ break;
+ }
+ }
+
+ if (magazine != 0 && release) {
+ foreign.freeClosureMagazine(magazine);
+ }
+ }
+ });
}
Slot get() {
@@ -225,29 +248,6 @@ public final class ClosurePool {
next = 0;
}
- @Override
- protected void finalize() throws Throwable {
- try {
- boolean release = true;
- //
- // If any of the closures allocated from this magazine set autorelease=false
- // then this magazine cannot be freed, so just let it leak
- //
- for (int i = 0; i < slots.length; i++) {
- if (!slots[i].autorelease) {
- release = false;
- break;
- }
- }
-
- if (magazine != 0 && release) {
- foreign.freeClosureMagazine(magazine);
- }
- } finally {
- super.finalize();
- }
- }
-
static final class Slot {
/**
* The address of the native closure structure.
@@ -273,22 +273,22 @@ public final class ClosurePool {
}
private static final class MagazineHolder {
+
final ClosurePool pool;
final Magazine magazine;
public MagazineHolder(ClosurePool pool, Magazine magazine) {
this.pool = pool;
this.magazine = magazine;
- }
- @Override
- protected void finalize() throws Throwable {
- try {
- pool.recycle(magazine);
- } finally {
- super.finalize();
- }
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ pool.recycle(magazine);
+ }
+ });
}
+
}
/**
@@ -339,4 +339,5 @@ public final class ClosurePool {
public void invoke(Buffer buffer) {
}
};
+
}
=====================================
src/main/java/com/kenai/jffi/Library.java
=====================================
@@ -32,6 +32,8 @@
package com.kenai.jffi;
+import com.kenai.jffi.internal.Cleaner;
+
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -164,6 +166,15 @@ public final class Library {
this.foreign = foreign;
this.name = name;
this.handle = address;
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ int disposed = UPDATER.getAndSet(Library.this, 1);
+ if (disposed == 0 && handle != 0L) {
+ foreign.dlclose(handle);
+ }
+ }
+ });
}
/**
@@ -191,16 +202,5 @@ public final class Library {
String error = lastError.get();
return error != null ? error : "unknown";
}
-
- @Override
- protected void finalize() throws Throwable {
- try {
- int disposed = UPDATER.getAndSet(this, 1);
- if (disposed == 0 && handle != 0L) {
- foreign.dlclose(handle);
- }
- } finally {
- super.finalize();
- }
- }
+
}
=====================================
src/main/java/com/kenai/jffi/NativeMethods.java
=====================================
@@ -32,7 +32,8 @@
package com.kenai.jffi;
-import java.util.ArrayList;
+import com.kenai.jffi.internal.Cleaner;
+
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
@@ -144,18 +145,19 @@ public final class NativeMethods {
public ResourceHolder(MemoryIO mm, long memory) {
this.mm = mm;
this.memory = memory;
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- mm.freeMemory(memory);
- } catch (Throwable t) {
- Logger.getLogger(getClass().getName()).log(Level.WARNING,
- "Exception when freeing native method struct array: %s", t.getLocalizedMessage());
- } finally {
- super.finalize();
- }
+
+ Cleaner.register(this, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mm.freeMemory(memory);
+ } catch (Throwable t) {
+ Logger.getLogger(getClass().getName()).log(Level.WARNING,
+ "Exception when freeing native method struct array: %s", t.getLocalizedMessage());
+ }
+ }
+ });
}
}
+
}
=====================================
src/main/java/com/kenai/jffi/internal/Cleaner.java
=====================================
@@ -0,0 +1,82 @@
+package com.kenai.jffi.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public final class Cleaner {
+
+ private Cleaner() {
+ throw new UnsupportedOperationException();
+ }
+
+ private static final Method createMethod;
+ private static final Method cleanMethod;
+ private static final Method registerMethod;
+ static {
+ Method method;
+ try {
+ method = Class.forName("java.lang.ref.Cleaner").getDeclaredMethod("register", Object.class, Runnable.class);
+ } catch (ClassNotFoundException | NoSuchMethodException e) {
+ method = null;
+ }
+ registerMethod = method;
+ if (registerMethod == null) {
+ try {
+ method = Class.forName("sun.misc.Cleaner").getDeclaredMethod("create", Object.class, Runnable.class);
+ } catch (NoSuchMethodException | ClassNotFoundException ignored) {
+ }
+ createMethod = method;
+ try {
+ method = Class.forName("java.lang.ref.Cleaner.Cleanable").getDeclaredMethod("clean");
+ } catch (ClassNotFoundException | NoSuchMethodException ignored) {
+ }
+ cleanMethod = method;
+ }
+ else {
+ try {
+ method = Class.forName("java.lang.ref.Cleaner").getDeclaredMethod("create");
+ } catch (ClassNotFoundException | NoSuchMethodException e) {
+ method = null;
+ }
+ createMethod = method;
+ try {
+ method = Class.forName("sun.misc.Cleaner").getDeclaredMethod("clean");
+ } catch (NoSuchMethodException | ClassNotFoundException ex) {
+ method = null;
+ }
+ cleanMethod = method;
+ }
+ }
+
+ private static final Object cleanerLock = new Object();
+ private static volatile Object cleaner;
+
+ private static Object getCleaner(Object object, Runnable cleanProc) {
+ if (cleaner == null) synchronized (cleanerLock) {
+ if (cleaner == null) {
+ try {
+ if (registerMethod == null) cleaner = createMethod.invoke(null, object, cleanProc);
+ else cleaner = registerMethod.invoke(createMethod.invoke(null), object, cleanProc);
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+ return cleaner;
+ }
+
+ public static Runnable register(Object object, Runnable cleanProc) {
+ Object cleaner = getCleaner(object, cleanProc);
+ return new Runnable() {
+ @Override
+ public void run() {
+ try {
+ cleanMethod.invoke(cleaner);
+ } catch (InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ };
+ }
+
+}
View it on GitLab: https://salsa.debian.org/java-team/jffi/-/compare/1ac55d75c43279b119f9a3bf8e02d75ab263878e...bdfaa3944ef2e28320c5d6217d22199106ba5440
--
View it on GitLab: https://salsa.debian.org/java-team/jffi/-/compare/1ac55d75c43279b119f9a3bf8e02d75ab263878e...bdfaa3944ef2e28320c5d6217d22199106ba5440
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20240220/e15cbdea/attachment.htm>
More information about the pkg-java-commits
mailing list