macOS: forcely ignore wait failures when closing down

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2023-01-30 22:10:44 +01:00
parent d2d44158f9
commit f5a01999fa
2 changed files with 21 additions and 4 deletions

View File

@ -1,6 +1,7 @@
/*
Copyright (C) 2001 Paul Davis
Copyright (C) 2004-2008 Grame
Copyright (C) 2016-2023 Filipe Coelho <falktx@falktx.com>
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 {

View File

@ -1,5 +1,6 @@
/*
Copyright (C) 2004-2008 Grame
Copyright (C) 2016-2023 Filipe Coelho <falktx@falktx.com>
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;
}