summaryrefslogtreecommitdiff
path: root/utils/ipc
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2021-07-26 14:35:51 +0530
committerUmang Jain <umang.jain@ideasonboard.com>2021-07-27 10:07:13 +0530
commit28990d36fea96f729231dfb6c978b7606b0f74cc (patch)
treebfeedac1ad100745f58ef951ee0b3e7340c62256 /utils/ipc
parent799a04b7e7a15b2ec37cb0b2439f8fcfad8ac5e9 (diff)
utils: ipc: Assign a new gid to proxy worker
Isolated IPAs are forked to a new process by the proxy worker, which shares the same process group. This allows the undesired effect that the proxy worker will receive signals such as SIGINT and will be closed by a Ctrl-C event before the pipeline handlers have been able to fully clean up. Prevent this signal from being delivered to the proxy worker by moving the process to a new process group, matching the pid of the isolated proxy. Bug: https://bugs.libcamera.org/show_bug.cgi?id=60 Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Diffstat (limited to 'utils/ipc')
-rw-r--r--utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl12
1 files changed, 12 insertions, 0 deletions
diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
index d993e39e..164a4dd6 100644
--- a/utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
+++ b/utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl
@@ -207,6 +207,18 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
+ /*
+ * Shutdown of proxy worker can be pre-empted by events like
+ * SIGINT/SIGTERM, even before the pipeline handler can request
+ * shutdown. Hence, assign a new gid to prevent signals on the
+ * application being delivered to the proxy.
+ */
+ if (setpgid(0, 0) < 0) {
+ int err = errno;
+ LOG({{proxy_worker_name}}, Warning)
+ << "Failed to set new gid: " << strerror(err);
+ }
+
{{proxy_worker_name}} proxyWorker;
int ret = proxyWorker.init(ipam, fd);
if (ret < 0) {