This patch calls Sleep() in lock() in order to increase the chance
of being unlocked in other threads. The lock(), unlock() and locked()
are moved from sigfe.s to cygtls.h so that allows inline expansion.

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/local_includes/cygtls.h | 13 +++++++---
 winsup/cygwin/scripts/gendef          | 36 ---------------------------
 2 files changed, 10 insertions(+), 39 deletions(-)

diff --git a/winsup/cygwin/local_includes/cygtls.h 
b/winsup/cygwin/local_includes/cygtls.h
index 28bbe60f0..fb5b02b4c 100644
--- a/winsup/cygwin/local_includes/cygtls.h
+++ b/winsup/cygwin/local_includes/cygtls.h
@@ -223,9 +223,16 @@ public: /* Do NOT remove this public: line, it's a marker 
for gentls_offsets. */
   int call_signal_handler ();
   void remove_wq (DWORD);
   void fixup_after_fork ();
-  void lock ();
-  void unlock ();
-  bool locked ();
+  void lock ()
+    {
+      while (InterlockedExchange (&stacklock, 1))
+       {
+         __asm__ ("pause");
+         Sleep (0);
+       }
+    }
+  void unlock () { stacklock = 0; }
+  bool locked () { return !!stacklock; }
   HANDLE get_signal_arrived (bool wait_for_lock = true)
   {
     if (!signal_arrived)
diff --git a/winsup/cygwin/scripts/gendef b/winsup/cygwin/scripts/gendef
index 720325fdd..7e14f69cf 100755
--- a/winsup/cygwin/scripts/gendef
+++ b/winsup/cygwin/scripts/gendef
@@ -322,42 +322,6 @@ _ZN7_cygtls3popEv:
        ret
        .seh_endproc
 
-# _cygtls::lock
-       .global _ZN7_cygtls4lockEv
-       .seh_proc _ZN7_cygtls4lockEv
-_ZN7_cygtls4lockEv:
-       pushq   %r12
-       .seh_pushreg %r12
-       .seh_endprologue
-       movq    %rcx,%r12
-1:     movl    \$1,%r11d
-       xchgl   %r11d,_cygtls.stacklock_p(%r12) # try to acquire lock
-       testl   %r11d,%r11d
-       jz      2f
-       pause
-       jmp     1b
-2:     popq    %r12
-       ret
-       .seh_endproc
-
-# _cygtls::unlock
-       .global _ZN7_cygtls6unlockEv
-       .seh_proc _ZN7_cygtls6unlockEv
-_ZN7_cygtls6unlockEv:
-       .seh_endprologue
-       decl    _cygtls.stacklock_p(%rcx)       # release lock
-       ret
-       .seh_endproc
-
-# _cygtls::locked
-       .global _ZN7_cygtls6lockedEv
-       .seh_proc _ZN7_cygtls6lockedEv
-_ZN7_cygtls6lockedEv:
-       .seh_endprologue
-       movl    _cygtls.stacklock_p(%rcx),%eax
-       ret
-       .seh_endproc
-
        .seh_proc stabilize_sig_stack
 stabilize_sig_stack:
        pushq   %r12
-- 
2.45.1

Reply via email to