On Tue, 18 Jun 2024 21:01:15 GMT, Daniel Jeliński <djelin...@openjdk.org> wrote:
> 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? BTW found this: https://devblogs.microsoft.com/oldnewthing/20160823-00/?p=94145 As I expected it is just a hashtable so may have scaling limitations. ------------- PR Comment: https://git.openjdk.org/jdk/pull/19778#issuecomment-2177766602