From 0492d41d97c9309d2a542fca54c7b51c34707173 Mon Sep 17 00:00:00 2001
From: Fabrizio Monti <fabrizio.monti@skywarder.eu>
Date: Fri, 14 Feb 2025 23:20:33 +0100
Subject: [PATCH] [DMA] Added simple scope guard class for DMAStream.

---
 src/shared/drivers/dma/DMA.h              | 24 +++++++++++++++++++++++
 src/tests/drivers/test-dma-mem-to-mem.cpp |  6 +++---
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/shared/drivers/dma/DMA.h b/src/shared/drivers/dma/DMA.h
index 3bb976f0f..6fd45988b 100644
--- a/src/shared/drivers/dma/DMA.h
+++ b/src/shared/drivers/dma/DMA.h
@@ -416,4 +416,28 @@ public:
     DMAStream& operator=(const DMAStream&) = delete;
 };
 
+class DMAStreamGuard
+{
+public:
+    DMAStreamGuard(DMAStream* ptr) : pStream(ptr) {}
+
+    ~DMAStreamGuard()
+    {
+        if (pStream != nullptr)
+        {
+            DMADriver::instance().releaseStream(pStream->getStreamId());
+        }
+    }
+
+    DMAStreamGuard(const DMAStreamGuard&)            = delete;
+    DMAStreamGuard& operator=(const DMAStreamGuard&) = delete;
+
+    DMAStream* operator->() { return pStream; }
+
+    inline DMAStream* get() { return pStream; }
+
+private:
+    DMAStream* pStream = nullptr;
+};
+
 }  // namespace Boardcore
diff --git a/src/tests/drivers/test-dma-mem-to-mem.cpp b/src/tests/drivers/test-dma-mem-to-mem.cpp
index d4970559d..fcfe2bfee 100644
--- a/src/tests/drivers/test-dma-mem-to-mem.cpp
+++ b/src/tests/drivers/test-dma-mem-to-mem.cpp
@@ -33,10 +33,10 @@ void printBuffer(uint8_t *buffer, size_t size);
 
 int main()
 {
-    DMAStream *stream = DMADriver::instance().automaticAcquireStreamBlocking(
-        DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero());
+    DMAStreamGuard stream(DMADriver::instance().automaticAcquireStreamBlocking(
+        DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero()));
 
-    if (stream == nullptr)
+    if (stream.get() == nullptr)
     {
         printf("Error, cannot allocate dma stream\n");
         return 0;
-- 
GitLab