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>
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>)
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
80inline 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." );
89inline 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?" );
95inline 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.