diff options
author | Stuart Carnie <stuart.carnie@gmail.com> | 2023-12-22 11:00:43 +1100 |
---|---|---|
committer | Stuart Carnie <stuart.carnie@gmail.com> | 2024-01-03 13:17:01 +1100 |
commit | 70bfd5d065b6276af411586a76f036a5765e8789 (patch) | |
tree | 7f1f7039dc679675f334330362a5a752259f1c97 | |
parent | 07b88600b793104b21244aa36d0cc37b689e9b95 (diff) | |
download | redot-engine-70bfd5d065b6276af411586a76f036a5765e8789.tar.gz |
fix: data race in PagedArray
-rw-r--r-- | core/templates/paged_array.h | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/core/templates/paged_array.h b/core/templates/paged_array.h index 863e3eef11..69a792958a 100644 --- a/core/templates/paged_array.h +++ b/core/templates/paged_array.h @@ -53,7 +53,12 @@ class PagedArrayPool { SpinLock spin_lock; public: - uint32_t alloc_page() { + struct PageInfo { + T *page = nullptr; + uint32_t page_id = 0; + }; + + PageInfo alloc_page() { spin_lock.lock(); if (unlikely(pages_available == 0)) { uint32_t pages_used = pages_allocated; @@ -69,13 +74,11 @@ public: } pages_available--; - uint32_t page = available_page_pool[pages_available]; + uint32_t page_id = available_page_pool[pages_available]; + T *page = page_pool[page_id]; spin_lock.unlock(); - return page; - } - T *get_page(uint32_t p_page_id) { - return page_pool[p_page_id]; + return PageInfo{ page, page_id }; } void free_page(uint32_t p_page_id) { @@ -190,9 +193,9 @@ public: _grow_page_array(); //keep out of inline } - uint32_t page_id = page_pool->alloc_page(); - page_data[page_count] = page_pool->get_page(page_id); - page_ids[page_count] = page_id; + typename PagedArrayPool<T>::PageInfo page_info = page_pool->alloc_page(); + page_data[page_count] = page_info.page; + page_ids[page_count] = page_info.page_id; } // place the new value |