[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