fix: data race in PagedArray

This commit is contained in:
Stuart Carnie 2023-12-22 11:00:43 +11:00
parent 07b88600b7
commit 70bfd5d065
No known key found for this signature in database
GPG key ID: 848D9C9718D78B4F

View file

@ -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