|
@@ -45,10 +45,6 @@ public class OpenCLObjectManager {
|
|
|
private static final Logger LOG = Logger.getLogger(OpenCLObjectManager.class.getName());
|
|
|
private static final Level LOG_LEVEL1 = Level.FINER;
|
|
|
private static final Level LOG_LEVEL2 = Level.FINE;
|
|
|
- /**
|
|
|
- * Call Runtime.getRuntime().gc() every these frames
|
|
|
- */
|
|
|
- private static final int GC_FREQUENCY = 10;
|
|
|
|
|
|
private static final OpenCLObjectManager INSTANCE = new OpenCLObjectManager();
|
|
|
private OpenCLObjectManager() {}
|
|
@@ -59,7 +55,6 @@ public class OpenCLObjectManager {
|
|
|
|
|
|
private ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
|
|
|
private HashSet<OpenCLObjectRef> activeObjects = new HashSet<OpenCLObjectRef>();
|
|
|
- private int gcCounter = 0;
|
|
|
|
|
|
private static class OpenCLObjectRef extends PhantomReference<Object> {
|
|
|
|
|
@@ -80,6 +75,7 @@ public class OpenCLObjectManager {
|
|
|
private void deleteObject(OpenCLObjectRef ref) {
|
|
|
LOG.log(LOG_LEVEL1, "deleting OpenCL object by: {0}", ref.releaser);
|
|
|
ref.releaser.release();
|
|
|
+ ref.clear();
|
|
|
activeObjects.remove(ref);
|
|
|
}
|
|
|
|
|
@@ -89,15 +85,6 @@ public class OpenCLObjectManager {
|
|
|
return; //nothing to do
|
|
|
}
|
|
|
|
|
|
- gcCounter++;
|
|
|
- if (gcCounter >= GC_FREQUENCY) {
|
|
|
- //The program is that the OpenCLObjects are so small that they are
|
|
|
- //enqueued for finalization very late. Therefore, without this
|
|
|
- //hack, we are running out of host memory on the OpenCL side quickly.
|
|
|
- gcCounter = 0;
|
|
|
- Runtime.getRuntime().gc();
|
|
|
- }
|
|
|
-
|
|
|
int removed = 0;
|
|
|
while (true) {
|
|
|
// Remove objects reclaimed by GC.
|
|
@@ -117,6 +104,7 @@ public class OpenCLObjectManager {
|
|
|
for (OpenCLObjectRef ref : activeObjects) {
|
|
|
LOG.log(LOG_LEVEL1, "deleting OpenCL object by: {0}", ref.releaser);
|
|
|
ref.releaser.release();
|
|
|
+ ref.clear();
|
|
|
}
|
|
|
activeObjects.clear();
|
|
|
}
|