Skip to content

Commit

Permalink
Stress out finalization happens at a safepoint
Browse files Browse the repository at this point in the history
  • Loading branch information
JaroslavTulach committed Apr 18, 2023
1 parent 88d37cf commit 4128784
Showing 1 changed file with 7 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.ThreadLocalAction;
import com.oracle.truffle.api.TruffleSafepoint;
import com.oracle.truffle.api.interop.InteropLibrary;
import org.enso.interpreter.runtime.data.ManagedResource;

Expand All @@ -10,8 +11,6 @@
import java.lang.ref.ReferenceQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -80,7 +79,7 @@ public void close(ManagedResource resource) {
return;
}
// Unconditional finalization – user controls the resource manually.
it.doFinalize(context);
it.scheduleFinalizeAtSafepoint(context);
}

/**
Expand All @@ -106,7 +105,7 @@ private void tryFinalize(Item it) {
// no further attempts are made.
boolean continueFinalizing = it.isFlaggedForFinalization().compareAndSet(true, false);
if (continueFinalizing) {
it.doFinalize(context);
it.scheduleFinalizeAtSafepoint(context);
items.remove(it.reference);
}
}
Expand Down Expand Up @@ -163,7 +162,7 @@ public void shutdown() {
Item it = items.remove(key);
if (it != null) {
// Finalize unconditionally – all other threads are dead by now.
it.doFinalize(context);
it.scheduleFinalizeAtSafepoint(context);
}
}
}
Expand Down Expand Up @@ -234,11 +233,12 @@ public Item(Object underlying, Object finalizer, PhantomReference<ManagedResourc
}

/**
* Unconditionally performs the finalization action of this resource.
* Unconditionally performs the finalization action of this resource when a {@link
* TruffleSafepoint} is hit.
*
* @param context current execution context
*/
public void doFinalize(EnsoContext context) {
public void scheduleFinalizeAtSafepoint(EnsoContext context) {
var futureToCancel = new AtomicReference<Future<Void>>(null);
var performFinalizer =
new ThreadLocalAction(false, false, true) {
Expand Down

0 comments on commit 4128784

Please sign in to comment.