Browse Source

CommandQueueMT: Fix flush re-entrancy

Pedro J. Estébanez 1 year ago
parent
commit
114b14b0fa
1 changed files with 6 additions and 7 deletions
  1. 6 7
      core/templates/command_queue_mt.h

+ 6 - 7
core/templates/command_queue_mt.h

@@ -364,6 +364,12 @@ class CommandQueueMT {
 	void _flush() {
 		lock();
 
+		if (unlikely(flush_read_ptr)) {
+			// Re-entrant call.
+			unlock();
+			return;
+		}
+
 		WorkerThreadPool::thread_enter_command_queue_mt_flush(this);
 		while (flush_read_ptr < command_mem.size()) {
 			uint64_t size = *(uint64_t *)&command_mem[flush_read_ptr];
@@ -376,13 +382,6 @@ class CommandQueueMT {
 				sync_sem->sem.post(); // Release in case it needs sync/ret.
 			}
 
-			if (unlikely(flush_read_ptr == 0)) {
-				// A reentrant call flushed.
-				DEV_ASSERT(command_mem.is_empty());
-				unlock();
-				return;
-			}
-
 			flush_read_ptr += size;
 		}
 		WorkerThreadPool::thread_exit_command_queue_mt_flush();