This patch replaces pause instruction with SwitchToThread() call
in wait loop in lock() to increase the chance to unlock in other
threads.

Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html
Fixes: 61522196c715 ("* Merge in cygwin-64bit-branch.")
Reported-by: Christian Franke <christian.fra...@t-online.de>
Reviewed-by:
Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
---
 winsup/cygwin/scripts/gendef | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/scripts/gendef b/winsup/cygwin/scripts/gendef
index 720325fdd..d1bcc5318 100755
--- a/winsup/cygwin/scripts/gendef
+++ b/winsup/cygwin/scripts/gendef
@@ -115,6 +115,8 @@ EOF
        .include "tlsoffsets"
        .text
 
+       .global SwitchToThread
+
        .seh_proc _sigfe_maybe
 _sigfe_maybe:                                  # stack is aligned on entry!
        .seh_endprologue
@@ -334,7 +336,7 @@ _ZN7_cygtls4lockEv:
        xchgl   %r11d,_cygtls.stacklock_p(%r12) # try to acquire lock
        testl   %r11d,%r11d
        jz      2f
-       pause
+       call    SwitchToThread
        jmp     1b
 2:     popq    %r12
        ret
-- 
2.45.1

Reply via email to