[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