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).

-------------

Commit messages:
 - add test case
 - convert CardImpl finalizer to use Cleaner

Changes: https://git.openjdk.org/jdk/pull/30683/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30683&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8380391
  Stats: 303 lines in 4 files changed: 206 ins; 50 del; 47 mod
  Patch: https://git.openjdk.org/jdk/pull/30683.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/30683/head:pull/30683

PR: https://git.openjdk.org/jdk/pull/30683

Reply via email to