@@ -27,25 +27,17 @@  PyCameraManager::PyCameraManager()
 		throw std::system_error(errno, std::generic_category(),
 					"Failed to create eventfd");
 
-	eventFd_ = fd;
+	eventFd_ = UniqueFD(fd);
 
 	int ret = cameraManager_->start();
-	if (ret) {
-		close(fd);
-		eventFd_ = -1;
+	if (ret)
 		throw std::system_error(-ret, std::generic_category(),
 					"Failed to start CameraManager");
-	}
 }
 
 PyCameraManager::~PyCameraManager()
 {
 	LOG(Python, Debug) << "~PyCameraManager()";
-
-	if (eventFd_ != -1) {
-		close(eventFd_);
-		eventFd_ = -1;
-	}
 }
 
 py::list PyCameraManager::cameras()
@@ -93,7 +85,7 @@  void PyCameraManager::writeFd()
 {
 	uint64_t v = 1;
 
-	size_t s = write(eventFd_, &v, 8);
+	size_t s = write(eventFd_.get(), &v, 8);
 	/*
 	 * We should never fail, and have no simple means to manage the error,
 	 * so let's log a fatal error.
@@ -106,7 +98,7 @@  void PyCameraManager::readFd()
 {
 	uint8_t buf[8];
 
-	if (read(eventFd_, buf, 8) != 8)
+	if (read(eventFd_.get(), buf, 8) != 8)
 		throw std::system_error(errno, std::generic_category());
 }
 
@@ -24,7 +24,7 @@  public:
 
 	static const std::string &version() { return CameraManager::version(); }
 
-	int eventFd() const { return eventFd_; }
+	int eventFd() const { return eventFd_.get(); }
 
 	std::vector<pybind11::object> getReadyRequests();
 
@@ -33,7 +33,7 @@  public:
 private:
 	std::unique_ptr<CameraManager> cameraManager_;
 
-	int eventFd_ = -1;
+	UniqueFD eventFd_;
 	std::mutex completedRequestsMutex_;
 	std::vector<Request *> completedRequests_;
 
 
  
Use UniqueFD to automate the eventfd lifetime management. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> --- src/py/libcamera/py_camera_manager.cpp | 16 ++++------------ src/py/libcamera/py_camera_manager.h | 4 ++-- 2 files changed, 6 insertions(+), 14 deletions(-)