15 #include <wpi/mutex.h>
17 #include "hal/Types.h"
18 #include "hal/handles/HandlesInternal.h"
33 template <
typename THandle,
typename TStruct, int16_t
size,
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);
47 void ResetHandles()
override;
50 std::array<std::shared_ptr<TStruct>, size> m_structures;
51 std::array<wpi::mutex, size> m_handleMutexes;
52 wpi::mutex m_allocateMutex;
55 template <
typename THandle,
typename TStruct, int16_t size,
59 std::shared_ptr<TStruct> toSet) {
61 std::scoped_lock lock(m_allocateMutex);
62 for (int16_t i = 0; i < size; i++) {
63 if (m_structures[i] ==
nullptr) {
66 std::scoped_lock lock(m_handleMutexes[i]);
67 m_structures[i] = toSet;
68 return static_cast<THandle>(
createHandle(i, enumValue, m_version));
71 return HAL_kInvalidHandle;
74 template <
typename THandle,
typename TStruct, int16_t
size,
76 std::shared_ptr<TStruct>
77 LimitedClassedHandleResource<THandle, TStruct, size, enumValue>::Get(
81 if (index < 0 || index >= size) {
84 std::scoped_lock lock(m_handleMutexes[index]);
87 return m_structures[index];
90 template <
typename THandle,
typename TStruct, int16_t
size,
92 void LimitedClassedHandleResource<THandle, TStruct, size, enumValue>::Free(
96 if (index < 0 || index >= size)
return;
98 std::scoped_lock allocateLock(m_allocateMutex);
99 std::scoped_lock handleLock(m_handleMutexes[index]);
100 m_structures[index].reset();
103 template <
typename THandle,
typename TStruct, int16_t
size,
105 void LimitedClassedHandleResource<THandle, TStruct,
size,
106 enumValue>::ResetHandles() {
108 std::scoped_lock allocateLock(m_allocateMutex);
109 for (
int i = 0; i <
size; i++) {
110 std::scoped_lock handleLock(m_handleMutexes[i]);
111 m_structures[i].reset();
114 HandleBase::ResetHandles();