Skip to content

Commit aaed153

Browse files
Handle macOS properly for Semaphore
1 parent cb04ac7 commit aaed153

File tree

2 files changed

+14
-17
lines changed

2 files changed

+14
-17
lines changed

source/numem/platform.d

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
*/
1111
module numem.platform;
1212

13-
mixin template CheckOS() {
14-
version(OSX) version = AppleOS;
15-
else version(iOS) version = AppleOS;
16-
else version(TVOS) version = AppleOS;
17-
else version(WatchOS) version = AppleOS;
18-
else version(VisionOS) version = AppleOS;
19-
}
13+
version(OSX) enum IsAppleOS = true;
14+
else version(iOS) enum IsAppleOS = true;
15+
else version(TVOS) enum IsAppleOS = true;
16+
else version(WatchOS) enum IsAppleOS = true;
17+
else version(VisionOS) enum IsAppleOS = true;
18+
else enum IsAppleOS = false;

source/numem/sync/semaphore.d

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import numem.core.memory;
1515
import core.sync.exception;
1616
import core.time : convert;
1717

18-
mixin CheckOS;
19-
2018
version(Windows) {
2119

2220
import core.sys.windows.basetsd;
@@ -25,7 +23,7 @@ version(Windows) {
2523
import core.sys.windows.winerror;
2624

2725
alias SemaphoreHandle = HANDLE;
28-
} else version(AppleOS) {
26+
} else static if(IsAppleOS) {
2927

3028
import core.sync.config;
3129
import core.stdc.errno;
@@ -70,7 +68,7 @@ public:
7068
bool rc = true;
7169

7270
version(Windows) rc = cast(bool)CloseHandle(handle);
73-
else version(AppleOS) rc = !semaphore_destroy(mach_task_self(), handle);
71+
else static if(IsAppleOS) rc = !semaphore_destroy(mach_task_self(), handle);
7472
else version(Posix) rc = !sem_destroy(&handle);
7573
assert(rc, "Unable to destroy semahpore");
7674
}
@@ -84,7 +82,7 @@ public:
8482
handle = CreateSemaphoreA(null, cast(LONG)count, int.max, null);
8583
if (handle == handle.init)
8684
throw nogc_new!SyncError("Unable to create semaphore");
87-
} else version(AppleOS) {
85+
} else static if(IsAppleOS) {
8886

8987
auto rc = semaphore_create(mach_task_self(), &handle, SYNC_POLICY_FIFO, cast(int)count);
9088
if (rc)
@@ -118,10 +116,10 @@ public:
118116
throw nogc_new!SyncError("Unable to wait for semaphore");
119117

120118
this.subCount();
121-
} else version(AppleOS) {
119+
} else static if(IsAppleOS) {
122120
mach_timespec_t timeout = mach_timespec_t(
123-
tv_sec: convert!("msecs", "seconds")(timeoutMs),
124-
tv_nsec: convert!("msecs", "nsecs")(timeoutMs)
121+
tv_sec: cast(uint)convert!("msecs", "seconds")(timeoutMs),
122+
tv_nsec: cast(clock_res_t)convert!("msecs", "nsecs")(timeoutMs)
125123
);
126124

127125
while(true) {
@@ -166,7 +164,7 @@ public:
166164

167165
this.subCount();
168166

169-
} else version(AppleOS) {
167+
} else static if(IsAppleOS) {
170168

171169
while(true) {
172170
auto rc = semaphore_wait(handle);
@@ -206,7 +204,7 @@ public:
206204
version(Windows) {
207205
if (!ReleaseSemaphore(handle, 1, null))
208206
throw nogc_new!SyncError("Unable to signal semaphore");
209-
} else version (AppleOS) {
207+
} else static if(IsAppleOS) {
210208
auto rc = semaphore_signal(handle);
211209
if (rc)
212210
throw nogc_new!SyncError("Unable to signal semaphore");

0 commit comments

Comments
 (0)