|
@@ -53,7 +53,12 @@ class PagedArrayPool {
|
|
SpinLock spin_lock;
|
|
SpinLock spin_lock;
|
|
|
|
|
|
public:
|
|
public:
|
|
- uint32_t alloc_page() {
|
|
|
|
|
|
+ struct PageInfo {
|
|
|
|
+ T *page = nullptr;
|
|
|
|
+ uint32_t page_id = 0;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ PageInfo alloc_page() {
|
|
spin_lock.lock();
|
|
spin_lock.lock();
|
|
if (unlikely(pages_available == 0)) {
|
|
if (unlikely(pages_available == 0)) {
|
|
uint32_t pages_used = pages_allocated;
|
|
uint32_t pages_used = pages_allocated;
|
|
@@ -69,13 +74,11 @@ public:
|
|
}
|
|
}
|
|
|
|
|
|
pages_available--;
|
|
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();
|
|
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) {
|
|
void free_page(uint32_t p_page_id) {
|
|
@@ -190,9 +193,9 @@ public:
|
|
_grow_page_array(); //keep out of inline
|
|
_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
|
|
// place the new value
|