Skip to content

Commit

Permalink
fix: data race in PagedArray
Browse files Browse the repository at this point in the history
  • Loading branch information
stuartcarnie committed Jan 3, 2024
1 parent 07b8860 commit 70bfd5d
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions core/templates/paged_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -69,13 +74,11 @@ class PagedArrayPool {
}

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) {
Expand Down Expand Up @@ -190,9 +193,9 @@ class PagedArray {
_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
Expand Down

0 comments on commit 70bfd5d

Please sign in to comment.