Przeglądaj źródła

fix: data race in PagedArray

(cherry picked from commit 70bfd5d065b6276af411586a76f036a5765e8789)
Stuart Carnie 1 rok temu
rodzic
commit
486998bee5
1 zmienionych plików z 12 dodań i 9 usunięć
  1. 12 9
      core/templates/paged_array.h

+ 12 - 9
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