summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-08-26 17:26:47 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2020-10-07 19:17:31 +0900
commit1469d5e26e27bf5fe4d065a6f3c87edd804f2888 (patch)
tree2ffd4611a917ef4f6a375609e607e749d04d65b2 /include
parent7e59bccb35015dea1a3ce6c50efb0cc23157060f (diff)
libcamera: ProcessManager: make ProcessManager lifetime explicitly managed
If any Process instances are destroyed after the ProcessManager is destroyed, then a segfault will occur. Fix this by making the lifetime of the ProcessManager explicit, and make the CameraManager construct and deconstruct (automatically, via a member variable) the ProcessManager. Update the tests accordingly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'include')
-rw-r--r--include/libcamera/internal/process.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/libcamera/internal/process.h b/include/libcamera/internal/process.h
index 2688557c..254cda85 100644
--- a/include/libcamera/internal/process.h
+++ b/include/libcamera/internal/process.h
@@ -7,6 +7,7 @@
#ifndef __LIBCAMERA_INTERNAL_PROCESS_H__
#define __LIBCAMERA_INTERNAL_PROCESS_H__
+#include <signal.h>
#include <string>
#include <vector>
@@ -14,6 +15,8 @@
namespace libcamera {
+class EventNotifier;
+
class Process final
{
public:
@@ -50,6 +53,32 @@ private:
friend class ProcessManager;
};
+class ProcessManager
+{
+public:
+ ProcessManager();
+ ~ProcessManager();
+
+ void registerProcess(Process *proc);
+
+ static ProcessManager *instance();
+
+ int writePipe() const;
+
+ const struct sigaction &oldsa() const;
+
+private:
+ static ProcessManager *self_;
+
+ void sighandler(EventNotifier *notifier);
+
+ std::list<Process *> processes_;
+
+ struct sigaction oldsa_;
+ EventNotifier *sigEvent_;
+ int pipe_[2];
+};
+
} /* namespace libcamera */
#endif /* __LIBCAMERA_INTERNAL_PROCESS_H__ */