Merge pull request #339 from devnexen/spin_impl_upd

Restricts cpu yield instructions a little.
This commit is contained in:
Daan 2020-12-17 14:06:23 -08:00 committed by GitHub
commit 03503ea4e5
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 4AEE18F83AFDEB23

View file

@ -282,16 +282,22 @@ static inline void mi_atomic_yield(void) {
YieldProcessor(); YieldProcessor();
} }
#elif (defined(__GNUC__) || defined(__clang__)) && \ #elif (defined(__GNUC__) || defined(__clang__)) && \
(defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)) (defined(__x86_64__) || defined(__i386__) || (defined(__arm__) && __ARM_ARCH__ >= 7) || defined(__aarch64__))
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
static inline void mi_atomic_yield(void) { static inline void mi_atomic_yield(void) {
__asm__ volatile ("pause" ::: "memory"); __asm__ volatile ("pause" ::: "memory");
} }
#elif defined(__arm__) || defined(__aarch64__) #elif (defined(__arm__) && __ARM_ARCH__ >= 7) || defined(__aarch64__)
static inline void mi_atomic_yield(void) { static inline void mi_atomic_yield(void) {
__asm__ volatile("yield"); __asm__ volatile("yield" ::: "memory");
} }
#endif #endif
#elif defined(__sun)
// Fallback for other archs
#include <synch.h>
static inline void mi_atomic_yield(void) {
smt_pause();
}
#elif defined(__wasi__) #elif defined(__wasi__)
#include <sched.h> #include <sched.h>
static inline void mi_atomic_yield(void) { static inline void mi_atomic_yield(void) {