diff options
author | Paul Elder <paul.elder@ideasonboard.com> | 2020-08-26 17:26:47 +0900 |
---|---|---|
committer | Paul Elder <paul.elder@ideasonboard.com> | 2020-10-07 19:17:31 +0900 |
commit | 1469d5e26e27bf5fe4d065a6f3c87edd804f2888 (patch) | |
tree | 2ffd4611a917ef4f6a375609e607e749d04d65b2 /include | |
parent | 7e59bccb35015dea1a3ce6c50efb0cc23157060f (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.h | 29 |
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__ */ |