[libcamera-devel] [PATCH 1/3] libcamera: raspberrypi: dma_heaps: Add open/close

Jacopo Mondi jacopo at jmondi.org
Thu Aug 27 10:20:36 CEST 2020


The dma_heaps device is opened in the class constructor, making
it impossible (or rather ugly) to catch errors before the allocator gets
actually used.

Provide an open() and a close() method to allow users to catch errors
earlier.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 .../pipeline/raspberrypi/dma_heaps.cpp        | 22 ++++++++++++++++---
 .../pipeline/raspberrypi/dma_heaps.h          |  2 ++
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
index 6769c04640f1..739f05d3d4d8 100644
--- a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
+++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
@@ -32,20 +32,36 @@ LOG_DECLARE_CATEGORY(RPI)
 namespace RPi {
 
 DmaHeap::DmaHeap()
+	: dmaHeapHandle_(-1)
+{
+}
+
+DmaHeap::~DmaHeap()
+{
+	close();
+}
+
+int DmaHeap::open()
 {
 	dmaHeapHandle_ = ::open(DMA_HEAP_CMA_NAME, O_RDWR, 0);
 	if (dmaHeapHandle_ == -1) {
 		dmaHeapHandle_ = ::open(DMA_HEAP_CMA_ALT_NAME, O_RDWR, 0);
 		if (dmaHeapHandle_ == -1) {
 			LOG(RPI, Error) << "Could not open dmaHeap device";
+			return dmaHeapHandle_;
 		}
 	}
+
+	return 0;
 }
 
-DmaHeap::~DmaHeap()
+void DmaHeap::close()
 {
-	if (dmaHeapHandle_)
-		::close(dmaHeapHandle_);
+	if (dmaHeapHandle_ < 0)
+		return;
+
+	::close(dmaHeapHandle_);
+	dmaHeapHandle_ = -1;
 }
 
 FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)
diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.h b/src/libcamera/pipeline/raspberrypi/dma_heaps.h
index ae6be1135f17..3e17993097ef 100644
--- a/src/libcamera/pipeline/raspberrypi/dma_heaps.h
+++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.h
@@ -18,6 +18,8 @@ class DmaHeap
 public:
 	DmaHeap();
 	~DmaHeap();
+	int open();
+	void close();
 	FileDescriptor alloc(const char *name, std::size_t size);
 
 private:
-- 
2.28.0



More information about the libcamera-devel mailing list