mirror of
https://github.com/macports/macports-ports.git
synced 2026-07-12 18:20:25 -07:00
101 lines
2.8 KiB
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
|