> We use 2 ParkEvent instances per thread. The ParkEvent objects are never > freed, but they are recycled when a thread dies, so the number of live > ParkEvent instances is proportional to the maximum number of threads that > were live at any time. > > On Windows, the ParkEvent object wraps a kernel Event object. Kernel objects > are a limited and costly resource. In this PR, I replace the use of kernel > events with user-space synchronization. > > The new implementation uses WaitOnAddress and WakeByAddressSingle methods to > implement synchronization. The methods are available since Windows 8. We only > support Windows 10 and newer, so OS support should not be a problem. > > WaitOnAddress was observed to return spuriously, so I added the necessary > code to recalculate the timeout and continue waiting. > > Tier1-5 tests passed. Performance tests were... inconclusive. For example, > `ThreadOnSpinWaitProducerConsumer` reported 30% better results, while > `LockUnlock.testContendedLock` results were 50% worse. > > Thoughts?
Daniel Jeliński has updated the pull request incrementally with one additional commit since the last revision: Update comment ------------- Changes: - all: https://git.openjdk.org/jdk/pull/19778/files - new: https://git.openjdk.org/jdk/pull/19778/files/23b70220..58403c0d Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=19778&range=01 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19778&range=00-01 Stats: 2 lines in 1 file changed: 0 ins; 0 del; 2 mod Patch: https://git.openjdk.org/jdk/pull/19778.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/19778/head:pull/19778 PR: https://git.openjdk.org/jdk/pull/19778