17 #ifndef __TBB_machine_H
18 #error Do not #include this internal file directly; use public TBB headers instead.
22 #define __TBB_Yield() sched_yield()
26 #include <sys/syscall.h>
28 #if defined(SYS_futex)
31 #define __TBB_USE_FUTEX 1
33 #if defined(__has_include)
34 #define __TBB_has_include __has_include
36 #define __TBB_has_include(x) 0
43 #if defined(__linux__) || __TBB_has_include(<linux/futex.h>)
44 #include <linux/futex.h>
45 #elif defined(__OpenBSD__) || __TBB_has_include(<sys/futex.h>)
46 #include <sys/futex.h>
56 #if defined(FUTEX_WAIT_PRIVATE)
57 #define __TBB_FUTEX_WAIT FUTEX_WAIT_PRIVATE
58 #elif defined(FUTEX_WAIT)
59 #define __TBB_FUTEX_WAIT FUTEX_WAIT
61 #define __TBB_FUTEX_WAIT 0
64 #if defined(FUTEX_WAKE_PRIVATE)
65 #define __TBB_FUTEX_WAKE FUTEX_WAKE_PRIVATE
66 #elif defined(FUTEX_WAKE)
67 #define __TBB_FUTEX_WAKE FUTEX_WAKE
69 #define __TBB_FUTEX_WAKE 1
73 #error machine specific headers must be included after tbb_stddef.h
80 inline int futex_wait(
void *futex,
int comparand ) {
81 int r = syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );
84 __TBB_ASSERT( r==0||r==EWOULDBLOCK||(r==-1&&(e==EAGAIN||e==EINTR)),
"futex_wait failed." );
89 inline int futex_wakeup_one(
void *futex ) {
90 int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,1,NULL,NULL,0 );
91 __TBB_ASSERT( r==0||r==1,
"futex_wakeup_one: more than one thread woken up?" );
95 inline int futex_wakeup_all(
void *futex ) {
96 int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,INT_MAX,NULL,NULL,0 );
97 __TBB_ASSERT( r>=0,
"futex_wakeup_all: error in waking up threads" );
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.