On Fri, 10 Apr 2026 18:41:27 GMT, Brent Christian <[email protected]> wrote:
> This is a pull request to convert the finalizer in > `sun.security.smartcardio.CardImpl` to use Cleaner instead. The relevant > state is refactored into a Context object, in the standard fashion. > > This change uses the recommended `try`/`finally`/`reachabilityFence()` > technique to prevent races between the program thread and the Cleaner thread, > per the `Reference.reachabilityFence()` API Note: > >> _there is a race between the program thread running the method, and the >> cleanup thread running the Cleaner or finalizer. The cleanup thread could >> free a resource, followed by the program thread (still running the method) >> attempting to access the now-already-freed resource. Use of >> reachabilityFence can prevent this race by ensuring that the object remains >> strongly reachable._ > > See > [Reference.reachabilityFence()](https://docs.oracle.com/en/java/javase/26/docs/api/java.base/java/lang/ref/Reference.html#reachabilityFence(java.lang.Object)) > and [java.lang.ref - Memory > Visibility](https://docs.oracle.com/en/java/javase/26/docs/api/java.base/java/lang/ref/package-summary.html#memory-consistency-properties-heading) > for details / background info. > > The test creates a `Card` object, and allows it to be collected. This > confirms that the new cleaning action does not hold onto the Owner ("this") > object, per the > [Cleaner](https://docs.oracle.com/en/java/javase/26/docs/api/java.base/java/lang/ref/Cleaner.html) > class API Note ("_it is important that the object implementing the cleaning > action does not hold references to the object_"). > > I've tried to make the test similar to nearby JavaCard tests. I tried it on > Windows using the latest JavaCard Simulator. > > --------- > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai). src/java.smartcardio/share/classes/sun/security/smartcardio/CardImpl.java line 312: > 310: if (context.state != State.OK) { // Should this also > de-register cleaner? > 311: return; > 312: } Everything which transitions the status to non-OK should've already done that, right? ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/30683#discussion_r3071989746
