Skip to content

Commit

Permalink
Handle macOS properly for Semaphore
Browse files Browse the repository at this point in the history
  • Loading branch information
LunaTheFoxgirl committed Nov 13, 2024
1 parent cb04ac7 commit aaed153
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 17 deletions.
13 changes: 6 additions & 7 deletions source/numem/platform.d
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@
*/
module numem.platform;

mixin template CheckOS() {
version(OSX) version = AppleOS;
else version(iOS) version = AppleOS;
else version(TVOS) version = AppleOS;
else version(WatchOS) version = AppleOS;
else version(VisionOS) version = AppleOS;
}
version(OSX) enum IsAppleOS = true;
else version(iOS) enum IsAppleOS = true;
else version(TVOS) enum IsAppleOS = true;
else version(WatchOS) enum IsAppleOS = true;
else version(VisionOS) enum IsAppleOS = true;
else enum IsAppleOS = false;
18 changes: 8 additions & 10 deletions source/numem/sync/semaphore.d
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import numem.core.memory;
import core.sync.exception;
import core.time : convert;

mixin CheckOS;

version(Windows) {

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

alias SemaphoreHandle = HANDLE;
} else version(AppleOS) {
} else static if(IsAppleOS) {

import core.sync.config;
import core.stdc.errno;
Expand Down Expand Up @@ -70,7 +68,7 @@ public:
bool rc = true;

version(Windows) rc = cast(bool)CloseHandle(handle);
else version(AppleOS) rc = !semaphore_destroy(mach_task_self(), handle);
else static if(IsAppleOS) rc = !semaphore_destroy(mach_task_self(), handle);
else version(Posix) rc = !sem_destroy(&handle);
assert(rc, "Unable to destroy semahpore");
}
Expand All @@ -84,7 +82,7 @@ public:
handle = CreateSemaphoreA(null, cast(LONG)count, int.max, null);
if (handle == handle.init)
throw nogc_new!SyncError("Unable to create semaphore");
} else version(AppleOS) {
} else static if(IsAppleOS) {

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

this.subCount();
} else version(AppleOS) {
} else static if(IsAppleOS) {
mach_timespec_t timeout = mach_timespec_t(
tv_sec: convert!("msecs", "seconds")(timeoutMs),
tv_nsec: convert!("msecs", "nsecs")(timeoutMs)
tv_sec: cast(uint)convert!("msecs", "seconds")(timeoutMs),
tv_nsec: cast(clock_res_t)convert!("msecs", "nsecs")(timeoutMs)
);

while(true) {
Expand Down Expand Up @@ -166,7 +164,7 @@ public:

this.subCount();

} else version(AppleOS) {
} else static if(IsAppleOS) {

while(true) {
auto rc = semaphore_wait(handle);
Expand Down Expand Up @@ -206,7 +204,7 @@ public:
version(Windows) {
if (!ReleaseSemaphore(handle, 1, null))
throw nogc_new!SyncError("Unable to signal semaphore");
} else version (AppleOS) {
} else static if(IsAppleOS) {
auto rc = semaphore_signal(handle);
if (rc)
throw nogc_new!SyncError("Unable to signal semaphore");
Expand Down

0 comments on commit aaed153

Please sign in to comment.