[Git][java-team/jffi][upstream] New upstream version 1.3.13+ds

Jérôme Charaoui (@lavamind) gitlab at salsa.debian.org
Tue Feb 20 01:10:44 GMT 2024



Jérôme Charaoui pushed to branch upstream at Debian Java Maintainers / jffi


Commits:
28cba2bc by Jérôme Charaoui at 2024-02-19T19:00:12-05:00
New upstream version 1.3.13+ds
- - - - -


11 changed files:

- .github/build-native-debian.sh
- .github/workflows/native-linux.yml
- 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:


=====================================
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/-/commit/28cba2bce4f8ecb572ab8ec8a9476ff65ed10da5

-- 
View it on GitLab: https://salsa.debian.org/java-team/jffi/-/commit/28cba2bce4f8ecb572ab8ec8a9476ff65ed10da5
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/21625551/attachment.htm>


More information about the pkg-java-commits mailing list