On Wed, 19 Jun 2024 13:59:23 GMT, Viktor Klang <vkl...@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?
>
> src/hotspot/os/windows/os_windows.cpp line 5565:
> 
>> 5563:       prd = MAXTIMEOUT;
>> 5564:     }
>> 5565:     HighResolutionInterval *phri = nullptr;
> 
> @djelinski Is this even used?

yeah, it's the C++ construction where the constructor and the destructor have 
side effects. It increases the system timer resolution, unless 
`ForceTimeHighResolution` is set. `ForceTimeHighResolution`, contrary to its 
name and help text, forces [low timer 
resolution](https://bugs.openjdk.org/browse/JDK-6435126). Sigh.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19778#discussion_r1646283869

Reply via email to