File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -70,7 +70,9 @@ PyMutex_LockFlags(PyMutex *m, _PyLockFlags flags)
7070// error messages) otherwise returns 0.
7171extern int _PyMutex_TryUnlock (PyMutex *m);
7272
73- // Yield the processor to other threads (e.g., sched_yield).
73+ // Yield the processor using a lightweight CPU pause hint (e.g., x86 PAUSE,
74+ // AArch64 WFE). Falls back to sched_yield()/SwitchToThread() on platforms
75+ // without a known pause instruction.
7476extern void _Py_yield (void );
7577
7678
Original file line number Diff line number Diff line change @@ -43,7 +43,19 @@ struct mutex_entry {
4343void
4444_Py_yield (void )
4545{
46- #ifdef MS_WINDOWS
46+ #if defined(__GNUC__ ) || defined(__clang__ )
47+ # if defined(__x86_64__ ) || defined(__i386__ )
48+ __asm__ volatile ("pause" ::: "memory" );
49+ # elif defined(__aarch64__ )
50+ __asm__ volatile ("wfe" );
51+ # elif defined(__arm__ ) && __ARM_ARCH >= 7
52+ __asm__ volatile ("yield" ::: "memory" );
53+ # elif defined(__powerpc__ ) || defined(__ppc__ ) || defined(__PPC__ )
54+ __asm__ volatile ("or 27,27,27" ::: "memory" );
55+ # else
56+ sched_yield ();
57+ # endif
58+ #elif defined(MS_WINDOWS )
4759 SwitchToThread ();
4860#elif defined(HAVE_SCHED_H )
4961 sched_yield ();
You can’t perform that action at this time.
0 commit comments