Bug: pipedal doesn't always shut down cleanly.

This commit is contained in:
Robin Davies
2024-09-05 13:06:37 -04:00
parent 7774dc06e6
commit 3a30c4f68a
2 changed files with 53 additions and 42 deletions
+33 -28
View File
@@ -172,40 +172,45 @@ void Updater::ThreadProc()
pfd.fd = this->event_reader; pfd.fd = this->event_reader;
pfd.events = POLLIN; pfd.events = POLLIN;
while (true) try {
{ while (true)
int ret = poll(&pfd, 1, std::chrono::duration_cast<std::chrono::milliseconds>(updateRate).count()); // 1000 ms timeout {
int ret = poll(&pfd, 1, std::chrono::duration_cast<std::chrono::milliseconds>(updateRate).count()); // 1000 ms timeout
if (ret == -1) if (ret == -1)
{
Lv2Log::error("Updater: Poll error.");
break;
}
else if (ret == 0)
{
CheckForUpdate(true);
}
else
{
// Event occurred
uint64_t value;
ssize_t s = read(event_reader, &value, sizeof(uint64_t));
if (s == sizeof(uint64_t))
{ {
if (value == CHECK_NOW_EVENT) Lv2Log::error("Updater: Poll error.");
break;
}
else if (ret == 0)
{
CheckForUpdate(true);
}
else
{
// Event occurred
uint64_t value;
ssize_t s = read(event_reader, &value, sizeof(uint64_t));
if (s == sizeof(uint64_t))
{ {
CheckForUpdate(true); if (value == CHECK_NOW_EVENT)
} {
else if (value == UNCACHED_CHECK_NOW_EVENT) CheckForUpdate(true);
{ }
CheckForUpdate(false); else if (value == UNCACHED_CHECK_NOW_EVENT)
} {
else CheckForUpdate(false);
{ }
break; else
{
break;
}
} }
} }
} }
} catch (const std::exception&e)
{
Lv2Log::error(SS("Updater: Service thread terminated abnormally: " << e.what()));
} }
} }
+20 -14
View File
@@ -220,8 +220,28 @@ int main(int argc, char *argv[])
return EXIT_SUCCESS; // tell systemd not to auto-restart. return EXIT_SUCCESS; // tell systemd not to auto-restart.
} }
} }
// only accept signals on the main thread.
// block now so that threads spawned by model inherit the block mask.
int sig;
sigset_t sigSet;
int s;
sigemptyset(&sigSet);
sigaddset(&sigSet, SIGINT);
sigaddset(&sigSet, SIGTERM);
sigaddset(&sigSet, SIGUSR1);
s = pthread_sigmask(SIG_BLOCK, &sigSet, NULL);
if (s != 0)
{
throw std::logic_error("pthread_sigmask failed.");
}
PiPedalModel model; PiPedalModel model;
model.SetRestartListener( model.SetRestartListener(
[]() []()
{ {
@@ -243,20 +263,6 @@ int main(int argc, char *argv[])
model.WaitForAudioDeviceToComeOnline(); model.WaitForAudioDeviceToComeOnline();
// only accept signals on the main thread.
int sig;
sigset_t sigSet;
int s;
sigemptyset(&sigSet);
sigaddset(&sigSet, SIGINT);
sigaddset(&sigSet, SIGTERM);
sigaddset(&sigSet, SIGUSR1);
s = pthread_sigmask(SIG_BLOCK, &sigSet, NULL);
if (s != 0)
{
throw std::logic_error("pthread_sigmask failed.");
}
#if JACK_HOST #if JACK_HOST
if (systemd) if (systemd)