PEL: Close PEL FD after getPEL call
To close the file descriptor returned from the getPEL D-Bus method call,
use the 'Defer' sdeventplus object to schedule it to happen from the
event loop.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I2b850a1c92215e7f66166cc5440d7071663065c0
diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index aec5053..a705e67 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -18,6 +18,8 @@
#include "additional_data.hpp"
#include "pel.hpp"
+#include <unistd.h>
+
#include <filesystem>
#include <fstream>
#include <xyz/openbmc_project/Common/error.hpp>
@@ -182,9 +184,25 @@
throw common_error::InvalidArgument();
}
+ scheduleFDClose(*fd);
+
return *fd;
}
+void Manager::scheduleFDClose(int fd)
+{
+ _fdCloserEventSource = std::make_unique<sdeventplus::source::Defer>(
+ _logManager.getBus().get_event(),
+ std::bind(std::mem_fn(&Manager::closeFD), this, fd,
+ std::placeholders::_1));
+}
+
+void Manager::closeFD(int fd, sdeventplus::source::EventBase& source)
+{
+ close(fd);
+ _fdCloserEventSource.reset();
+}
+
std::vector<uint8_t> Manager::getPELFromOBMCID(uint32_t obmcLogID)
{
Repository::LogID id{Repository::LogID::Obmc(obmcLogID)};