OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
yield.hpp
1#pragma once
2#include <ossia/detail/config.hpp>
3
4// Adapted from bind9:
5// https://gitlab.isc.org/isc-projects/bind9/-/blob/main/lib/isc/rwlock.c
6#if defined(__EMSCRIPTEN__)
7#include <thread>
8// TODO once we support asyncify
9#define ossia_rwlock_pause() std::this_thread::yield()
10#elif defined(__x86_64__) || defined(_M_X64)
11#include <immintrin.h>
12#define ossia_rwlock_pause() _mm_pause()
13#elif defined(__i386__)
14#define ossia_rwlock_pause() __asm__ __volatile__("rep; nop" ::: "memory")
15#elif defined(__ia64__)
16#define ossia_rwlock_pause() __asm__ __volatile__("hint @pause" ::: "memory")
17#elif defined(__aarch64__)
18#define ossia_rwlock_pause() __asm__ __volatile__("dmb ishst\n\tyield" ::: "memory")
19#elif defined(__arm__)
20#define ossia_rwlock_pause() __asm__ __volatile__("yield" ::: "memory")
21#elif defined(__sparc) || defined(__sparc__)
22#define ossia_rwlock_pause() __asm__ __volatile__("pause" ::: "memory")
23#elif defined(__ppc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) \
24|| defined(_ARCH_PWR2) || defined(_POWER)
25#define ossia_rwlock_pause() __asm__ __volatile__("or 27,27,27" ::: "memory")
26#elif defined(#elif defined(__riscv)
27#define ossia_rwlock_pause() __asm__ __volatile__("pause" ::: "memory")
28#elif defined(_MSC_VER)
29#include <windows.h>
30#define ossia_rwlock_pause() YieldProcessor()
31#else
32#include <thread>
33#define ossia_rwlock_pause() std::this_thread::yield()
34#endif