Files
macports-ports/devel/onetbb/files/patch-onetbb-dispatch-fallback.diff

101 lines
2.8 KiB
Diff

diff --git src/tbb/semaphore.h src/tbb/semaphore.h
index 9d27f3ac..b8942329 100644
--- src/tbb/semaphore.h
+++ src/tbb/semaphore.h
@@ -22,8 +22,16 @@
#if _WIN32||_WIN64
#include <windows.h>
#elif __APPLE__
+#include <AvailabilityMacros.h>
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && !defined(__ppc__)
#include <dispatch/dispatch.h>
#else
+#include <mach/semaphore.h>
+#include <mach/task.h>
+#include <mach/mach_init.h>
+#include <mach/error.h>
+#endif
+#else
#include <semaphore.h>
#ifdef TBB_USE_DEBUG
#include <cerrno>
@@ -144,6 +152,7 @@ private:
};
#elif __APPLE__
//! Edsger Dijkstra's counting semaphore
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && !defined(__ppc__)
class semaphore : no_copy {
public:
//! ctor
@@ -160,6 +169,34 @@ public:
private:
dispatch_semaphore_t my_sem;
};
+#else
+class semaphore : no_copy {
+public:
+ //! ctor
+ semaphore(int start_cnt_ = 0) : sem(start_cnt_) { init_semaphore(start_cnt_); }
+ //! dtor
+ ~semaphore() {
+ kern_return_t ret = semaphore_destroy( mach_task_self(), sem );
+ __TBB_ASSERT_EX( ret==err_none, nullptr);
+ }
+ //! wait/acquire
+ void P() {
+ int ret;
+ do {
+ ret = semaphore_wait( sem );
+ } while( ret==KERN_ABORTED );
+ __TBB_ASSERT( ret==KERN_SUCCESS, "semaphore_wait() failed" );
+ }
+ //! post/release
+ void V() { semaphore_signal( sem ); }
+private:
+ semaphore_t sem;
+ void init_semaphore(int start_cnt_) {
+ kern_return_t ret = semaphore_create( mach_task_self(), &sem, SYNC_POLICY_FIFO, start_cnt_ );
+ __TBB_ASSERT_EX( ret==err_none, "failed to create a semaphore" );
+ }
+};
+#endif /* __APPLE__ */
#else /* Linux/Unix */
typedef uint32_t sem_count_t;
//! Edsger Dijkstra's counting semaphore
@@ -231,7 +268,35 @@ private:
#endif /* !__TBB_USE_SRWLOCK */
#elif __APPLE__
//! binary_semaphore for concurrent monitor
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && !defined(__ppc__)
using binary_semaphore = semaphore;
+#else
+class binary_semaphore : no_copy {
+public:
+ //! ctor
+ binary_semaphore() : my_sem(0) {
+ kern_return_t ret = semaphore_create( mach_task_self(), &my_sem, SYNC_POLICY_FIFO, 0 );
+ __TBB_ASSERT_EX( ret==err_none, "failed to create a semaphore" );
+ }
+ //! dtor
+ ~binary_semaphore() {
+ kern_return_t ret = semaphore_destroy( mach_task_self(), my_sem );
+ __TBB_ASSERT_EX( ret==err_none, nullptr);
+ }
+ //! wait/acquire
+ void P() {
+ int ret;
+ do {
+ ret = semaphore_wait( my_sem );
+ } while( ret==KERN_ABORTED );
+ __TBB_ASSERT( ret==KERN_SUCCESS, "semaphore_wait() failed" );
+ }
+ //! post/release
+ void V() { semaphore_signal( my_sem ); }
+private:
+ semaphore_t my_sem;
+};
+#endif /* __APPLE__ */
#else /* Linux/Unix */
#if __TBB_USE_FUTEX