Browse Source

macOS: forcely ignore wait failures when closing down

Signed-off-by: falkTX <falktx@falktx.com>
tags/v1.9.22
falkTX 1 year ago
parent
commit
f5a01999fa
2 changed files with 21 additions and 4 deletions
  1. +8
    -0
      common/JackClient.cpp
  2. +13
    -4
      macosx/JackMachSemaphore.mm

+ 8
- 0
common/JackClient.cpp 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 {


+ 13
- 4
macosx/JackMachSemaphore.mm 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;
}


Loading…
Cancel
Save