libcamera: process: Manage pipe fds by UniqueFD

Manages the file descriptors owned by Process for pipe by UniqueFDs.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Hirokazu Honda 2021-06-10 16:50:21 +09:00 committed by Laurent Pinchart
parent bf26505dc8
commit c49e888848
2 changed files with 13 additions and 7 deletions

View file

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include <libcamera/base/signal.h> #include <libcamera/base/signal.h>
#include <libcamera/base/unique_fd.h>
namespace libcamera { namespace libcamera {
@ -75,8 +76,9 @@ private:
std::list<Process *> processes_; std::list<Process *> processes_;
struct sigaction oldsa_; struct sigaction oldsa_;
EventNotifier *sigEvent_; EventNotifier *sigEvent_;
int pipe_[2]; UniqueFD pipe_[2];
}; };
} /* namespace libcamera */ } /* namespace libcamera */

View file

@ -69,7 +69,7 @@ void sigact(int signal, siginfo_t *info, void *ucontext)
void ProcessManager::sighandler() void ProcessManager::sighandler()
{ {
char data; char data;
ssize_t ret = read(pipe_[0], &data, sizeof(data)); ssize_t ret = read(pipe_[0].get(), &data, sizeof(data));
if (ret < 0) { if (ret < 0) {
LOG(Process, Error) LOG(Process, Error)
<< "Failed to read byte from signal handler pipe"; << "Failed to read byte from signal handler pipe";
@ -129,10 +129,15 @@ ProcessManager::ProcessManager()
sigaction(SIGCHLD, &sa, NULL); sigaction(SIGCHLD, &sa, NULL);
if (pipe2(pipe_, O_CLOEXEC | O_DIRECT | O_NONBLOCK)) int pipe[2];
if (pipe2(pipe, O_CLOEXEC | O_DIRECT | O_NONBLOCK))
LOG(Process, Fatal) LOG(Process, Fatal)
<< "Failed to initialize pipe for signal handling"; << "Failed to initialize pipe for signal handling";
sigEvent_ = new EventNotifier(pipe_[0], EventNotifier::Read);
pipe_[0] = UniqueFD(pipe[0]);
pipe_[1] = UniqueFD(pipe[1]);
sigEvent_ = new EventNotifier(pipe_[0].get(), EventNotifier::Read);
sigEvent_->activated.connect(this, &ProcessManager::sighandler); sigEvent_->activated.connect(this, &ProcessManager::sighandler);
self_ = this; self_ = this;
@ -141,9 +146,8 @@ ProcessManager::ProcessManager()
ProcessManager::~ProcessManager() ProcessManager::~ProcessManager()
{ {
sigaction(SIGCHLD, &oldsa_, NULL); sigaction(SIGCHLD, &oldsa_, NULL);
delete sigEvent_; delete sigEvent_;
close(pipe_[0]);
close(pipe_[1]);
self_ = nullptr; self_ = nullptr;
} }
@ -170,7 +174,7 @@ ProcessManager *ProcessManager::instance()
*/ */
int ProcessManager::writePipe() const int ProcessManager::writePipe() const
{ {
return pipe_[1]; return pipe_[1].get();
} }
/** /**