From adffb853a7482a858879f36bdb4e107b88d73cfc Mon Sep 17 00:00:00 2001 From: Aaron R Robinson Date: Fri, 11 Aug 2023 11:37:16 -0700 Subject: [PATCH] Update 2.0.4 Special case ARM32 targets --- src/dnne-pkg/dnne-pkg.csproj | 2 +- src/platform/platform.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dnne-pkg/dnne-pkg.csproj b/src/dnne-pkg/dnne-pkg.csproj index 9716180..9bed51d 100644 --- a/src/dnne-pkg/dnne-pkg.csproj +++ b/src/dnne-pkg/dnne-pkg.csproj @@ -17,7 +17,7 @@ DNNE - 2.0.3 + 2.0.4 AaronRobinsonMSFT AaronRobinsonMSFT Package used to generated native exports for .NET assemblies. diff --git a/src/platform/platform.c b/src/platform/platform.c index 191c41f..76dbd31 100644 --- a/src/platform/platform.c +++ b/src/platform/platform.c @@ -297,12 +297,21 @@ static void set_current_error(int err) static void enter_lock(dnne_lock_handle* lock) { +#ifdef __arm__ + // There are some arm32 platforms that don't provide __atomic_compare_exchange_n(). + // Instead of trying to special case them, always use the compiler (gcc/clang) intrinsic. + while (__sync_val_compare_and_swap(lock, DNNE_LOCK_OPEN, -1) != DNNE_LOCK_OPEN) + { + (void)sched_yield(); // Yield instead of sleeping. + } +#else long tmp = DNNE_LOCK_OPEN; while (!__atomic_compare_exchange_n(lock, &tmp, -1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { (void)sched_yield(); // Yield instead of sleeping. tmp = DNNE_LOCK_OPEN; } +#endif // !__arm__ } static void exit_lock(dnne_lock_handle* lock)