From e6be56b71f47ea24b8248dfa66b1853031120916 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 3 Nov 2023 11:02:04 +0100 Subject: [PATCH 1/2] DPL: only listen to SIGUSR1 when the task is alive --- Framework/Core/include/Framework/DeviceContext.h | 2 ++ Framework/Core/src/DataProcessingDevice.cxx | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Framework/Core/include/Framework/DeviceContext.h b/Framework/Core/include/Framework/DeviceContext.h index d34192ec6ad3d..3777e7f608b75 100644 --- a/Framework/Core/include/Framework/DeviceContext.h +++ b/Framework/Core/include/Framework/DeviceContext.h @@ -16,6 +16,7 @@ #define O2_FRAMEWORK_DEVICECONTEXT_H_ typedef struct uv_timer_s uv_timer_t; +typedef struct uv_signal_s uv_signal_t; namespace o2::framework { @@ -27,6 +28,7 @@ struct ComputingQuotaStats; struct DeviceContext { ComputingQuotaStats* quotaStats = nullptr; uv_timer_t* gracePeriodTimer = nullptr; + uv_signal_t* sigusr1Handle = nullptr; int expectedRegionCallbacks = 0; int exitTransitionTimeout = 0; }; diff --git a/Framework/Core/src/DataProcessingDevice.cxx b/Framework/Core/src/DataProcessingDevice.cxx index 9a575a95b078a..0bfeb7df2fdc5 100644 --- a/Framework/Core/src/DataProcessingDevice.cxx +++ b/Framework/Core/src/DataProcessingDevice.cxx @@ -972,10 +972,12 @@ void DataProcessingDevice::InitTask() // an event from the outside, making sure that the event loop can // be unblocked (e.g. by a quitting DPL driver) even when there // is no data pending to be processed. - auto* sigusr1Handle = (uv_signal_t*)malloc(sizeof(uv_signal_t)); - uv_signal_init(state.loop, sigusr1Handle); - sigusr1Handle->data = &mServiceRegistry; - uv_signal_start(sigusr1Handle, on_signal_callback, SIGUSR1); + if (deviceContext.sigusr1Handle == nullptr) { + deviceContext.sigusr1Handle = (uv_signal_t*)malloc(sizeof(uv_signal_t)); + deviceContext.sigusr1Handle->data = &mServiceRegistry; + uv_signal_init(state.loop, deviceContext.sigusr1Handle); + } + uv_signal_start(deviceContext.sigusr1Handle, on_signal_callback, SIGUSR1); /// Initialise the pollers DataProcessingDevice::initPollers(); @@ -1675,6 +1677,11 @@ void DataProcessingDevice::ResetTask() { ServiceRegistryRef ref{mServiceRegistry}; ref.get().clear(); + auto &deviceContext = ref.get(); + // Stop the signal handler + if (deviceContext.sigusr1Handle) { + uv_signal_stop(deviceContext.sigusr1Handle); + } } struct WaitBackpressurePolicy { From 0b8951dd7a90e03ae40bbe20b9e0006c112d87e3 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 3 Nov 2023 10:30:46 +0000 Subject: [PATCH 2/2] Please consider the following formatting changes --- Framework/Core/src/DataProcessingDevice.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Framework/Core/src/DataProcessingDevice.cxx b/Framework/Core/src/DataProcessingDevice.cxx index 0bfeb7df2fdc5..1a4ec7ae1b04f 100644 --- a/Framework/Core/src/DataProcessingDevice.cxx +++ b/Framework/Core/src/DataProcessingDevice.cxx @@ -1677,7 +1677,7 @@ void DataProcessingDevice::ResetTask() { ServiceRegistryRef ref{mServiceRegistry}; ref.get().clear(); - auto &deviceContext = ref.get(); + auto& deviceContext = ref.get(); // Stop the signal handler if (deviceContext.sigusr1Handle) { uv_signal_stop(deviceContext.sigusr1Handle);