File tree 3 files changed +39
-6
lines changed
3 files changed +39
-6
lines changed Original file line number Diff line number Diff line change @@ -72,6 +72,14 @@ Date: TBD
72
72
[DESCRIPTION]
73
73
Changes
74
74
75
+ [ENTRY]
76
+ Module: support
77
+ What: change
78
+ Rank: minor
79
+ [DESCRIPTION]
80
+ Detect is os_unfair_lock is available at runtime, in order to be able
81
+ to support older versions of macOS in the same binaries.
82
+
75
83
[ENTRY]
76
84
Module: flatzinc
77
85
What: change
Original file line number Diff line number Diff line change @@ -108,8 +108,14 @@ namespace Gecode { namespace Support {
108
108
// / Use a simple but more efficient critical section on Windows
109
109
CRITICAL_SECTION w_cs;
110
110
#elif defined(GECODE_THREADS_OSX_UNFAIR)
111
- // / Use unfair lock on macOS
112
- os_unfair_lock lck;
111
+ // / Use unfair lock on macOS if available, OSSpinLock on older macOS
112
+ union {
113
+ os_unfair_lock unfair_lck;
114
+ #pragma clang diagnostic push
115
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
116
+ OSSpinLock spin_lck;
117
+ #pragma clang diagnostic pop
118
+ } u;
113
119
#elif defined(GECODE_THREADS_PTHREADS)
114
120
// / The Pthread mutex
115
121
pthread_mutex_t p_m;
Original file line number Diff line number Diff line change @@ -45,26 +45,45 @@ namespace Gecode { namespace Support {
45
45
46
46
#ifdef GECODE_THREADS_OSX_UNFAIR
47
47
48
+ #pragma clang diagnostic push
49
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
48
50
/*
49
51
* Mutex
50
52
*/
51
53
forceinline
52
- Mutex::Mutex (void ) : lck(OS_UNFAIR_LOCK_INIT) {}
54
+ Mutex::Mutex (void ) {
55
+ if (&os_unfair_lock_lock != NULL )
56
+ u.unfair_lck = OS_UNFAIR_LOCK_INIT;
57
+ else
58
+ u.spin_lck = OS_SPINLOCK_INIT;
59
+ }
53
60
forceinline void
54
61
Mutex::acquire (void ) {
55
- os_unfair_lock_lock (&lck);
62
+ if (&os_unfair_lock_lock != NULL ) {
63
+ os_unfair_lock_lock (&u.unfair_lck );
64
+ } else {
65
+ OSSpinLockLock (&u.spin_lck );
66
+ }
56
67
}
57
68
forceinline bool
58
69
Mutex::tryacquire (void ) {
59
- return os_unfair_lock_trylock (&lck);
70
+ if (&os_unfair_lock_trylock != NULL )
71
+ return os_unfair_lock_trylock (&u.unfair_lck );
72
+ else
73
+ return OSSpinLockTry (&u.spin_lck );
60
74
}
61
75
forceinline void
62
76
Mutex::release (void ) {
63
- os_unfair_lock_unlock (&lck);
77
+ if (&os_unfair_lock_unlock != NULL )
78
+ os_unfair_lock_unlock (&u.unfair_lck );
79
+ else
80
+ OSSpinLockUnlock (&u.spin_lck );
64
81
}
65
82
forceinline
66
83
Mutex::~Mutex (void ) {}
67
84
85
+ #pragma clang diagnostic pop
86
+
68
87
#else
69
88
70
89
/*
You can’t perform that action at this time.
0 commit comments