From fdfefff77f1f6b1be699b8fcf7139487d67ee10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Sat, 16 Aug 2025 13:10:21 +0700 Subject: [PATCH] supercollider: fix yield for armv6l --- srcpkgs/supercollider/patches/yield.patch | 96 +++++++++++++++++++++++ srcpkgs/supercollider/template | 2 +- 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/supercollider/patches/yield.patch diff --git a/srcpkgs/supercollider/patches/yield.patch b/srcpkgs/supercollider/patches/yield.patch new file mode 100644 index 00000000000..ce8ad5cf779 --- /dev/null +++ b/srcpkgs/supercollider/patches/yield.patch @@ -0,0 +1,96 @@ +--- a/include/plugin_interface/SC_SndBuf.h ++++ b/include/plugin_interface/SC_SndBuf.h +@@ -28,16 +28,7 @@ + + # include + # include +- +-/* for rw_spinlock::pause() */ +-# if defined(_MSC_VER) +-# ifndef NOMINMAX +-# define NOMINMAX +-# endif +-# include +-# elif defined(__SSE2__) +-# include +-# endif ++# include + + + class rw_spinlock { +@@ -45,19 +36,7 @@ class rw_spinlock { + static const uint32_t locked_state = 0x80000000; + static const uint32_t reader_mask = 0x7fffffff; + +-/* this is a simplified version of nova::detail::pause() */ +-# if defined(_MSC_VER) /* Visual Studio Intel/ARM64 */ +- static inline void pause() { YieldProcessor(); } +-# elif defined(__SSE2__) /* all modern Intel processors */ +- static inline void pause() { _mm_pause(); } +-# elif defined(__aarch64__) /* 64-bit ARM */ +- static inline void pause() { __asm__ __volatile__("isb"); } +-# elif defined(__arm__) /* 32-bit ARM */ +- static inline void pause() { __asm__ __volatile__("yield"); } +-# else +-# warning "unknown architecture: fall back to busy-waiting" +- static inline void pause() {} +-# endif ++ static inline void pause() { std::this_thread::yield(); } + + public: + struct unique_lock { +--- a/external_libraries/nova-tt/nova-tt/pause.hpp ++++ b/external_libraries/nova-tt/nova-tt/pause.hpp +@@ -21,50 +21,14 @@ + #ifndef NOVA_TT_PAUSE_HPP + #define NOVA_TT_PAUSE_HPP + +-#if defined(_MSC_VER) +-#include +-#elif defined(__x86_64__) || defined(__SSE2__) +-/* amd64 resp. SSE2 */ +-#define NOVA_TT_USE_MM_PAUSE +-#include +-#elif defined(__i386__) && defined(__GNUC__) +-#define NOVA_TT_USE_REP_NOP +-#elif defined(__aarch64__) && defined(__GNUC__) +-/* ARM64 */ +-#define NOVA_TT_USE_ARM_ISB +-#elif defined(__arm__) && defined(__GNUC__) && \ +- (defined(__ARM_ARCH_6K__) || \ +- defined(__ARM_ARCH_6Z__) || \ +- defined(__ARM_ARCH_6ZK__) || \ +- defined(__ARM_ARCH_6T2__) || \ +- defined(__ARM_ARCH_7__) || \ +- defined(__ARM_ARCH_7A__) || \ +- defined(__ARM_ARCH_7R__) || \ +- defined(__ARM_ARCH_7M__) || \ +- defined(__ARM_ARCH_7S__) || \ +- defined(__ARM_ARCH_8A__)) +-/* mnemonic 'yield' is supported from ARMv6k onwards */ +-#define NOVA_TT_USE_ARM_YIELD +-#else /* fall back to busy-waiting */ +-#warning "Cannot pause CPU, falling back to busy-waiting." +-#endif ++#include + + namespace nova { + namespace detail { + + static inline void pause() + { +-#if defined(_MSC_VER) +- YieldProcessor(); /* expands to pause/yield instruction */ +-#elif defined(NOVA_TT_USE_MM_PAUSE) +- _mm_pause(); +-#elif defined(NOVA_TT_USE_REP_NOP) +- __asm__ __volatile__( "rep; nop" : : : "memory" ); +-#elif defined(NOVA_TT_USE_ARM_ISB) +- __asm__ __volatile__("isb"); +-#elif defined(NOVA_TT_USE_ARM_YIELD) +- __asm__ __volatile__("yield"); +-#endif ++ std::this_thread::yield(); + } + + }} diff --git a/srcpkgs/supercollider/template b/srcpkgs/supercollider/template index d572d837862..eecae33c565 100644 --- a/srcpkgs/supercollider/template +++ b/srcpkgs/supercollider/template @@ -40,7 +40,7 @@ case "$XBPS_TARGET_MACHINE" in *) configure_args+=" -DSSE=OFF -DSSE2=OFF";; esac -pre_configure() { +pre_patch() { # https://github.com/supercollider/supercollider/issues/4096 rm -rf external_libraries/boost sed -i 's/yaml/yaml-cpp/g' CMakeLists.txt editors/sc-ide/CMakeLists.txt