@@ -14,6 +14,7 @@
#include <linux/media.h>
+#include <libcamera/scoped_fd.h>
#include <libcamera/signal.h>
#include "libcamera/internal/log.h"
@@ -82,7 +83,7 @@ private:
unsigned int version_;
unsigned int hwRevision_;
- int fd_;
+ ScopedFD fd_;
bool valid_;
bool acquired_;
bool lockOwner_;
@@ -63,15 +63,14 @@ LOG_DEFINE_CATEGORY(MediaDevice)
* populate() before the media graph can be queried.
*/
MediaDevice::MediaDevice(const std::string &deviceNode)
- : deviceNode_(deviceNode), fd_(-1), valid_(false), acquired_(false),
+ : deviceNode_(deviceNode), valid_(false), acquired_(false),
lockOwner_(false)
{
}
MediaDevice::~MediaDevice()
{
- if (fd_ != -1)
- ::close(fd_);
+ fd_.reset();
clear();
}
@@ -143,14 +142,14 @@ void MediaDevice::release()
*/
bool MediaDevice::lock()
{
- if (fd_ == -1)
+ if (!fd_.isValid())
return false;
/* Do not allow nested locking in the same libcamera instance. */
if (lockOwner_)
return false;
- if (lockf(fd_, F_TLOCK, 0))
+ if (lockf(fd_.get(), F_TLOCK, 0))
return false;
lockOwner_ = true;
@@ -169,7 +168,7 @@ bool MediaDevice::lock()
*/
void MediaDevice::unlock()
{
- if (fd_ == -1)
+ if (!fd_.isValid())
return;
if (!lockOwner_)
@@ -177,7 +176,7 @@ void MediaDevice::unlock()
lockOwner_ = false;
- lockf(fd_, F_ULOCK, 0);
+ lockf(fd_.get(), F_ULOCK, 0);
}
/**
@@ -220,7 +219,7 @@ int MediaDevice::populate()
return ret;
struct media_device_info info = {};
- ret = ioctl(fd_, MEDIA_IOC_DEVICE_INFO, &info);
+ ret = ioctl(fd_.get(), MEDIA_IOC_DEVICE_INFO, &info);
if (ret) {
ret = -errno;
LOG(MediaDevice, Error)
@@ -243,7 +242,7 @@ int MediaDevice::populate()
topology.ptr_links = reinterpret_cast<uintptr_t>(links);
topology.ptr_pads = reinterpret_cast<uintptr_t>(pads);
- ret = ioctl(fd_, MEDIA_IOC_G_TOPOLOGY, &topology);
+ ret = ioctl(fd_.get(), MEDIA_IOC_G_TOPOLOGY, &topology);
if (ret < 0) {
ret = -errno;
LOG(MediaDevice, Error)
@@ -481,20 +480,18 @@ int MediaDevice::disableLinks()
*/
int MediaDevice::open()
{
- if (fd_ != -1) {
+ if (fd_.isValid()) {
LOG(MediaDevice, Error) << "MediaDevice already open";
return -EBUSY;
}
- int ret = ::open(deviceNode_.c_str(), O_RDWR);
- if (ret < 0) {
- ret = -errno;
+ fd_ = ScopedFD(::open(deviceNode_.c_str(), O_RDWR));
+ if (!fd_.isValid()) {
LOG(MediaDevice, Error)
<< "Failed to open media device at "
- << deviceNode_ << ": " << strerror(-ret);
- return ret;
+ << deviceNode_ << ": " << strerror(errno);
+ return -errno;
}
- fd_ = ret;
return 0;
}
@@ -514,11 +511,7 @@ int MediaDevice::open()
*/
void MediaDevice::close()
{
- if (fd_ == -1)
- return;
-
- ::close(fd_);
- fd_ = -1;
+ fd_.reset();
}
/**
@@ -763,7 +756,7 @@ void MediaDevice::fixupEntityFlags(struct media_v2_entity *entity)
struct media_entity_desc desc = {};
desc.id = entity->id;
- int ret = ioctl(fd_, MEDIA_IOC_ENUM_ENTITIES, &desc);
+ int ret = ioctl(fd_.get(), MEDIA_IOC_ENUM_ENTITIES, &desc);
if (ret < 0) {
ret = -errno;
LOG(MediaDevice, Debug)
@@ -806,7 +799,7 @@ int MediaDevice::setupLink(const MediaLink *link, unsigned int flags)
linkDesc.flags = flags;
- int ret = ioctl(fd_, MEDIA_IOC_SETUP_LINK, &linkDesc);
+ int ret = ioctl(fd_.get(), MEDIA_IOC_SETUP_LINK, &linkDesc);
if (ret) {
ret = -errno;
LOG(MediaDevice, Error)
Manages a file descriptor owned by MediaDevice for a media device node by ScopedFD. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> --- include/libcamera/internal/media_device.h | 3 +- src/libcamera/media_device.cpp | 39 ++++++++++------------- 2 files changed, 18 insertions(+), 24 deletions(-)