浏览代码

Merge pull request #103298 from bruvzg/comque_race

Use atomic flag to prevent `flush_if_pending` from reading unlocked `command_mem`.
Rémi Verschelde 6 月之前
父节点
当前提交
01545c995b
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      core/templates/command_queue_mt.h

+ 4 - 1
core/templates/command_queue_mt.h

@@ -114,6 +114,7 @@ class CommandQueueMT {
 	uint32_t sync_awaiters = 0;
 	WorkerThreadPool::TaskID pump_task_id = WorkerThreadPool::INVALID_TASK_ID;
 	uint64_t flush_read_ptr = 0;
+	std::atomic<bool> pending;
 
 	template <typename T, typename... Args>
 	_FORCE_INLINE_ void create_command(Args &&...p_args) {
@@ -126,6 +127,7 @@ class CommandQueueMT {
 		*(uint64_t *)&command_mem[size] = alloc_size;
 		void *cmd = &command_mem[size + sizeof(uint64_t)];
 		new (cmd) T(std::forward<Args>(p_args)...);
+		pending.store(true);
 	}
 
 	template <typename T, bool NeedsSync, typename... Args>
@@ -186,6 +188,7 @@ class CommandQueueMT {
 		}
 
 		command_mem.clear();
+		pending.store(false);
 		flush_read_ptr = 0;
 
 		_prevent_sync_wraparound();
@@ -226,7 +229,7 @@ public:
 	}
 
 	_FORCE_INLINE_ void flush_if_pending() {
-		if (unlikely(command_mem.size() > 0)) {
+		if (unlikely(pending.load())) {
 			_flush();
 		}
 	}