This is an attempt to fix inconsistent behavior of TerminatingThreadLocal(s) 
when used internally in JDK for per-carrier-thread caches of native 
ByteBuffer(s) and NativeBuffer(s). If used from virtual thread, such 
TerminatingThreadLocal(s) are not registered with the carrier thread for the 
cleanup.
The fix introduces an internal CarrierThreadLocal subclass of ThreadLocal which 
rewires its API methods to use current thread's carrier thread as the source of 
ThreadLocalMap instead of current thread itself (if it is a VirtualThread for 
example). TerminatingThreadLocal is now a subclass of CarrierThreadLocal. It 
seems only per-carrier-thread caching is a usecase for it. The uses of 
JavaLangAccess in various places to access a carrier-thread value of given 
ThreadLocal has been replaced by public API calls and the use of 
CarrierThreadLocal instead of plain ThreadLocal. JavaLangAccess is still used 
to dispatch the CarrierThreadLocal API methods, but only for that. Would 
someone be tempted to use JavaLangAccess methods directly, they now require 
CarrierThreadLocal argument to guard against missuses.
The REGISTRY of TerminatingThreadLocal(s) that tracks which of them have values 
bound to a particular carrier thread is now implemented conveniently  with a 
CarrierThreadLocal.
The test is expanded with a case that demonstrates a situation where a carrier 
thread is terminated. Since it must wait for 30 seconds for that to happen, 
only one of the test cases is performed in this mode. The correct logic of 
TerminatingThreadLocal is still verified with all test-cases using platform 
threads that can be terminated more rapidly.

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

Commit messages:
 - new internal CarrierThreadLocal as a base for TerminatingThreadLocal

Changes: https://git.openjdk.org/jdk/pull/9743/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9743&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8291897
  Stats: 255 lines in 9 files changed: 193 ins; 9 del; 53 mod
  Patch: https://git.openjdk.org/jdk/pull/9743.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9743/head:pull/9743

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

Reply via email to