From 7dcef197855bec8afb54fdad0bd86e0e5ece64be Mon Sep 17 00:00:00 2001 From: Jianfeng Mao <4297243+jmao-denver@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:30:50 -0700 Subject: [PATCH] fix: make PyObject cleanup thread-safe in free-threaded Python and reduce contention (#176) * Fix a bug in Py Obj cleanup & reduce contention * Remove unneeded code * enable the java-to-python tests * Revert "enable the java-to-python tests" This reverts commit 5de1fe28f740455dacaf68b5e3f124e29061f6ce. --- src/main/java/org/jpy/PyObject.java | 5 ----- src/main/java/org/jpy/PyObjectReferences.java | 6 +----- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/org/jpy/PyObject.java b/src/main/java/org/jpy/PyObject.java index 44f0740..13f36a1 100644 --- a/src/main/java/org/jpy/PyObject.java +++ b/src/main/java/org/jpy/PyObject.java @@ -42,8 +42,6 @@ public class PyObject implements AutoCloseable { private static final AtomicReference CLEANUP_THREAD = new AtomicReference<>(); - private static final boolean CLEANUP_ON_INIT = Boolean.parseBoolean(System.getProperty("PyObject.cleanup_on_init", "true")); - private static final boolean CLEANUP_ON_THREAD = Boolean.parseBoolean(System.getProperty("PyObject.cleanup_on_thread", "true")); private static void startCleanupThread() { @@ -71,9 +69,6 @@ public static int cleanup() { PyObject(long pointer, boolean fromJNI) { state = new PyObjectState(pointer); if (fromJNI) { - if (CLEANUP_ON_INIT) { - REFERENCES.threadSafeCleanup(); // only performs *one* cleanup - } if (CLEANUP_ON_THREAD) { // ensures that we've only started after python has been started, and we know there is something to cleanup startCleanupThread(); diff --git a/src/main/java/org/jpy/PyObjectReferences.java b/src/main/java/org/jpy/PyObjectReferences.java index 4afea8a..c5cd2b8 100644 --- a/src/main/java/org/jpy/PyObjectReferences.java +++ b/src/main/java/org/jpy/PyObjectReferences.java @@ -76,11 +76,7 @@ private Reference asRef(PyObject pyObject) { /** * This should *only* be invoked through the proxy, or when we *know* we have the GIL. */ - public int threadSafeCleanup() { - return threadSafeCleanup(buffer); - } - - private int threadSafeCleanup(long[] buffer) { + public synchronized int threadSafeCleanup() { return PyLib.ensureGil(() -> { int index = 0; while (index < buffer.length) {