diff --git a/common/JackClient.cpp b/common/JackClient.cpp index 43de6b3e..74a9dca8 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -1,6 +1,7 @@ /* Copyright (C) 2001 Paul Davis Copyright (C) 2004-2008 Grame +Copyright (C) 2016-2023 Filipe Coelho This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -638,6 +639,13 @@ inline bool JackClient::WaitSync() { // Suspend itself: wait on the input synchro if (GetGraphManager()->SuspendRefNum(GetClientControl(), fSynchroTable, LONG_MAX) < 0) { +#ifdef __APPLE__ + // FIXME macOS reports wait failures when closing down, due to aborted semaphore, ignore it + if (!GetClientControl()->fActive) { + fThread.Terminate(); + return true; + } +#endif jack_error("SuspendRefNum error"); return false; } else { diff --git a/macosx/JackMachSemaphore.mm b/macosx/JackMachSemaphore.mm index f2ba3dd7..8b855657 100644 --- a/macosx/JackMachSemaphore.mm +++ b/macosx/JackMachSemaphore.mm @@ -1,5 +1,6 @@ /* Copyright (C) 2004-2008 Grame +Copyright (C) 2016-2023 Filipe Coelho This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -92,11 +93,15 @@ bool JackMachSemaphore::Wait() kern_return_t res = semaphore_wait(fSemaphore); - // killing a thread will abort the semaphore wait - if (res == KERN_SUCCESS || res == KERN_ABORTED) { + if (res == KERN_SUCCESS) { return true; } + // killing a thread will abort the semaphore wait, skip the error log + if (res == KERN_ABORTED) { + return false; + } + jack_error("JackMachSemaphore::Wait name = %s err = %s", fName, mach_error_string(res)); return false; } @@ -114,11 +119,15 @@ bool JackMachSemaphore::TimedWait(long usec) kern_return_t res = semaphore_timedwait(fSemaphore, time); - // killing a thread will abort the semaphore wait - if (res == KERN_SUCCESS || res == KERN_ABORTED) { + if (res == KERN_SUCCESS) { return true; } + // killing a thread will abort the semaphore wait, skip the error log + if (res == KERN_ABORTED) { + return false; + } + jack_error("JackMachSemaphore::TimedWait name = %s usec = %ld err = %s", fName, usec, mach_error_string(res)); return false; }