15 #include "HAL/Types.h"
16 #include "HAL/cpp/make_unique.h"
17 #include "HAL/cpp/priority_mutex.h"
18 #include "HAL/handles/HandlesInternal.h"
33 template <
typename THandle,
typename TStruct, int16_t size,
34 HAL_HandleEnum enumValue>
36 friend class LimitedClassedHandleResourceTest;
44 THandle Allocate(std::shared_ptr<TStruct> toSet);
45 std::shared_ptr<TStruct> Get(THandle handle);
46 void Free(THandle handle);
49 std::array<std::shared_ptr<TStruct>, size> m_structures;
50 std::array<priority_mutex, size> m_handleMutexes;
54 template <
typename THandle,
typename TStruct, int16_t size,
55 HAL_HandleEnum enumValue>
58 std::shared_ptr<TStruct> toSet) {
60 std::lock_guard<priority_mutex> sync(m_allocateMutex);
62 for (i = 0; i < size; i++) {
63 if (m_structures[i] ==
nullptr) {
66 std::lock_guard<priority_mutex> sync(m_handleMutexes[i]);
67 m_structures[i] = toSet;
68 return static_cast<THandle
>(createHandle(i, enumValue));
71 return HAL_kInvalidHandle;
74 template <
typename THandle,
typename TStruct, int16_t size,
75 HAL_HandleEnum enumValue>
76 std::shared_ptr<TStruct> LimitedClassedHandleResource<
77 THandle, TStruct, size, enumValue>::Get(THandle handle) {
79 int16_t index = getHandleTypedIndex(handle, enumValue);
80 if (index < 0 || index >= size) {
83 std::lock_guard<priority_mutex> sync(m_handleMutexes[index]);
86 return m_structures[index];
89 template <
typename THandle,
typename TStruct, int16_t size,
90 HAL_HandleEnum enumValue>
91 void LimitedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
94 int16_t index = getHandleTypedIndex(handle, enumValue);
95 if (index < 0 || index >= size)
return;
97 std::lock_guard<priority_mutex> sync(m_allocateMutex);
98 std::lock_guard<priority_mutex> lock(m_handleMutexes[index]);
99 m_structures[index].reset();
Definition: priority_mutex.h:53
The LimitedClassedHandleResource class is a way to track handles.
Definition: LimitedClassedHandleResource.h:35