Fix strong reference in Cleaners (#2404)

This commit is contained in:
Jesse Kane
2026-03-26 14:55:06 -04:00
committed by GitHub
parent e19534da47
commit 52f1f7726f
2 changed files with 16 additions and 31 deletions

View File

@@ -19,8 +19,8 @@ package org.photonvision.vision.objects;
import java.awt.Color;
import java.lang.ref.Cleaner;
import java.lang.ref.Cleaner.Cleanable;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.photonvision.common.logging.LogGroup;
@@ -36,8 +36,11 @@ public class RknnObjectDetector implements ObjectDetector {
/** Cleaner instance to release the detector when it goes out of scope */
private final Cleaner cleaner = Cleaner.create();
/** Atomic boolean to ensure that the native object can only be released once. */
private AtomicBoolean released = new AtomicBoolean(false);
private final Cleanable cleanable;
private static Runnable cleanupAction(long ptr) {
return () -> RknnJNI.destroy(ptr);
}
/** Pointer to the native object */
private final long objPointer;
@@ -80,7 +83,7 @@ public class RknnObjectDetector implements ObjectDetector {
logger.debug("Created detector for model " + model.modelFile.getName());
// Register the cleaner to release the detector when it goes out of scope
cleaner.register(this, this::release);
cleanable = cleaner.register(this, cleanupAction(objPointer));
}
/**
@@ -137,17 +140,6 @@ public class RknnObjectDetector implements ObjectDetector {
/** Thread-safe method to release the detector. */
@Override
public void release() {
// Checks if the atomic is 'false', and if so, sets it to 'true'
if (released.compareAndSet(false, true)) {
if (objPointer <= 0) {
logger.error(
"Detector is not initialized, and so it can't be released! Model: "
+ model.modelFile.getName());
return;
}
RknnJNI.destroy(objPointer);
logger.debug("Released detector for model " + model.modelFile.getName());
}
cleanable.clean();
}
}

View File

@@ -19,8 +19,8 @@ package org.photonvision.vision.objects;
import java.awt.Color;
import java.lang.ref.Cleaner;
import java.lang.ref.Cleaner.Cleanable;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.photonvision.common.logging.LogGroup;
@@ -36,8 +36,11 @@ public class RubikObjectDetector implements ObjectDetector {
/** Cleaner instance to release the detector when it goes out of scope */
private final Cleaner cleaner = Cleaner.create();
/** Atomic boolean to ensure that the native object can only be released once. */
private AtomicBoolean released = new AtomicBoolean(false);
private final Cleanable cleanable;
private static Runnable cleanupAction(long ptr) {
return () -> RubikJNI.destroy(ptr);
}
/** Pointer to the native object */
private final long ptr;
@@ -88,7 +91,7 @@ public class RubikObjectDetector implements ObjectDetector {
logger.debug("Created detector for model " + model.modelFile.getName());
// Register the cleaner to release the detector when it goes out of scope
cleaner.register(this, this::release);
cleanable = cleaner.register(this, cleanupAction(ptr));
}
/**
@@ -146,17 +149,7 @@ public class RubikObjectDetector implements ObjectDetector {
/** Thread-safe method to release the detector. */
@Override
public void release() {
// Checks if the atomic is 'false', and if so, sets it to 'true'
if (released.compareAndSet(false, true)) {
if (!isValid()) {
logger.error(
"Detector is not initialized, and so it can't be released! Model: "
+ model.modelFile.getName());
return;
}
RubikJNI.destroy(ptr);
logger.debug("Released detector for model " + model.modelFile.getName());
}
cleanable.clean();
}
private boolean isValid() {