From 7597e3c2747b8fd8e41bebe8723e14b843bbb162 Mon Sep 17 00:00:00 2001 From: Thad House Date: Thu, 7 Jul 2016 21:32:41 -0700 Subject: [PATCH] Switches handle resources to dynamic arrays (#142) --- .../athena/handles/DigitalHandleResource.h | 20 +++++++++++++--- .../athena/handles/IndexedHandleResource.h | 24 ++++++++++++++++--- .../handles/LimitedClassedHandleResource.h | 24 ++++++++++++++++--- .../athena/handles/LimitedHandleResource.h | 24 ++++++++++++++++--- 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/hal/lib/athena/handles/DigitalHandleResource.h b/hal/lib/athena/handles/DigitalHandleResource.h index 8e6bc513e6..a0818592b9 100644 --- a/hal/lib/athena/handles/DigitalHandleResource.h +++ b/hal/lib/athena/handles/DigitalHandleResource.h @@ -38,16 +38,30 @@ class DigitalHandleResource { public: DigitalHandleResource(const DigitalHandleResource&) = delete; DigitalHandleResource operator=(const DigitalHandleResource&) = delete; - DigitalHandleResource() = default; + DigitalHandleResource(); + ~DigitalHandleResource(); THandle Allocate(int16_t index, HalHandleEnum enumValue, int32_t* status); std::shared_ptr Get(THandle handle, HalHandleEnum enumValue); void Free(THandle handle, HalHandleEnum enumValue); private: - std::shared_ptr m_structures[size]; - priority_mutex m_handleMutexes[size]; + // Dynamic array to shrink HAL file size. + std::shared_ptr* m_structures; + priority_mutex* m_handleMutexes; }; +template +DigitalHandleResource::DigitalHandleResource() { + m_structures = new std::shared_ptr[size]; + m_handleMutexes = new priority_mutex[size]; +} + +template +DigitalHandleResource::~DigitalHandleResource() { + delete[] m_structures; + delete[] m_handleMutexes; +} + template THandle DigitalHandleResource::Allocate( int16_t index, HalHandleEnum enumValue, int32_t* status) { diff --git a/hal/lib/athena/handles/IndexedHandleResource.h b/hal/lib/athena/handles/IndexedHandleResource.h index 76baa14e2c..c99a8741a3 100644 --- a/hal/lib/athena/handles/IndexedHandleResource.h +++ b/hal/lib/athena/handles/IndexedHandleResource.h @@ -39,16 +39,34 @@ class IndexedHandleResource { public: IndexedHandleResource(const IndexedHandleResource&) = delete; IndexedHandleResource operator=(const IndexedHandleResource&) = delete; - IndexedHandleResource() = default; + IndexedHandleResource(); + ~IndexedHandleResource(); THandle Allocate(int16_t index, int32_t* status); std::shared_ptr Get(THandle handle); void Free(THandle handle); private: - std::shared_ptr m_structures[size]; - priority_mutex m_handleMutexes[size]; + // Dynamic array to shrink HAL file size. + std::shared_ptr* m_structures; + priority_mutex* m_handleMutexes; }; +template +IndexedHandleResource::IndexedHandleResource() { + m_structures = new std::shared_ptr[size]; + m_handleMutexes = new priority_mutex[size]; +} + +template +IndexedHandleResource::~IndexedHandleResource() { + delete[] m_structures; + delete[] m_handleMutexes; +} + template THandle IndexedHandleResource::Allocate( diff --git a/hal/lib/athena/handles/LimitedClassedHandleResource.h b/hal/lib/athena/handles/LimitedClassedHandleResource.h index 2b8086f649..8648b56ed6 100644 --- a/hal/lib/athena/handles/LimitedClassedHandleResource.h +++ b/hal/lib/athena/handles/LimitedClassedHandleResource.h @@ -38,17 +38,35 @@ class LimitedClassedHandleResource { LimitedClassedHandleResource(const LimitedClassedHandleResource&) = delete; LimitedClassedHandleResource operator=(const LimitedClassedHandleResource&) = delete; - LimitedClassedHandleResource() = default; + LimitedClassedHandleResource(); + ~LimitedClassedHandleResource(); THandle Allocate(std::shared_ptr toSet); std::shared_ptr Get(THandle handle); void Free(THandle handle); private: - std::shared_ptr m_structures[size]; - priority_mutex m_handleMutexes[size]; + // Dynamic array to shrink HAL file size. + std::shared_ptr* m_structures; + priority_mutex* m_handleMutexes; priority_mutex m_allocateMutex; }; +template +LimitedClassedHandleResource::LimitedClassedHandleResource() { + m_structures = new std::shared_ptr[size]; + m_handleMutexes = new priority_mutex[size]; +} + +template +LimitedClassedHandleResource::~LimitedClassedHandleResource() { + delete[] m_structures; + delete[] m_handleMutexes; +} + template THandle diff --git a/hal/lib/athena/handles/LimitedHandleResource.h b/hal/lib/athena/handles/LimitedHandleResource.h index 573c31a5dd..8444f79f71 100644 --- a/hal/lib/athena/handles/LimitedHandleResource.h +++ b/hal/lib/athena/handles/LimitedHandleResource.h @@ -36,17 +36,35 @@ class LimitedHandleResource { public: LimitedHandleResource(const LimitedHandleResource&) = delete; LimitedHandleResource operator=(const LimitedHandleResource&) = delete; - LimitedHandleResource() = default; + LimitedHandleResource(); + ~LimitedHandleResource(); THandle Allocate(); std::shared_ptr Get(THandle handle); void Free(THandle handle); private: - std::shared_ptr m_structures[size]; - priority_mutex m_handleMutexes[size]; + // Dynamic array to shrink HAL file size. + std::shared_ptr* m_structures; + priority_mutex* m_handleMutexes; priority_mutex m_allocateMutex; }; +template +LimitedHandleResource::LimitedHandleResource() { + m_structures = new std::shared_ptr[size]; + m_handleMutexes = new priority_mutex[size]; +} + +template +LimitedHandleResource::~LimitedHandleResource() { + delete[] m_structures; + delete[] m_handleMutexes; +} + template THandle LimitedHandleResource::Allocate() {