mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-24 17:15:07 +03:00
The mmaps_ map stores a pointer to the V4L2CameraProxy to avoid increasing the reference count on the V4L2CameraFile shared pointer needlessly. While this provides a small optimization, it prevents accessing the V4L2CameraFile from the munmap() function which doesn't take an fd as argument. To prepare for improved debugging that will require access to V4L2CameraFile in munmap(), store the V4L2CameraFile pointer in mmaps_. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
69 lines
1.7 KiB
C++
69 lines
1.7 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* v4l2_compat_manager.h - V4L2 compatibility manager
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <fcntl.h>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <sys/types.h>
|
|
#include <vector>
|
|
|
|
#include <libcamera/camera_manager.h>
|
|
|
|
#include "v4l2_camera_proxy.h"
|
|
|
|
class V4L2CompatManager
|
|
{
|
|
public:
|
|
struct FileOperations {
|
|
using openat_func_t = int (*)(int dirfd, const char *path,
|
|
int oflag, ...);
|
|
using dup_func_t = int (*)(int oldfd);
|
|
using close_func_t = int (*)(int fd);
|
|
using ioctl_func_t = int (*)(int fd, unsigned long request, ...);
|
|
using mmap_func_t = void *(*)(void *addr, size_t length, int prot,
|
|
int flags, int fd, off64_t offset);
|
|
using munmap_func_t = int (*)(void *addr, size_t length);
|
|
|
|
openat_func_t openat;
|
|
dup_func_t dup;
|
|
close_func_t close;
|
|
ioctl_func_t ioctl;
|
|
mmap_func_t mmap;
|
|
munmap_func_t munmap;
|
|
};
|
|
|
|
static V4L2CompatManager *instance();
|
|
|
|
const FileOperations &fops() const { return fops_; }
|
|
|
|
int openat(int dirfd, const char *path, int oflag, mode_t mode);
|
|
|
|
int dup(int oldfd);
|
|
int close(int fd);
|
|
void *mmap(void *addr, size_t length, int prot, int flags,
|
|
int fd, off64_t offset);
|
|
int munmap(void *addr, size_t length);
|
|
int ioctl(int fd, unsigned long request, void *arg);
|
|
|
|
private:
|
|
V4L2CompatManager();
|
|
~V4L2CompatManager();
|
|
|
|
int start();
|
|
int getCameraIndex(int fd);
|
|
std::shared_ptr<V4L2CameraFile> cameraFile(int fd);
|
|
|
|
FileOperations fops_;
|
|
|
|
libcamera::CameraManager *cm_;
|
|
|
|
std::vector<std::unique_ptr<V4L2CameraProxy>> proxies_;
|
|
std::map<int, std::shared_ptr<V4L2CameraFile>> files_;
|
|
std::map<void *, std::shared_ptr<V4L2CameraFile>> mmaps_;
|
|
};
|