Fuzzer: Wait for all commands to complete before destroying the wire

Bug: chromium:1074739
Change-Id: I32591efe42559299234053f112a2f846d43612ab
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21366
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/fuzzers/BUILD.gn b/src/fuzzers/BUILD.gn
index 4479cef..71a6d88 100644
--- a/src/fuzzers/BUILD.gn
+++ b/src/fuzzers/BUILD.gn
@@ -90,6 +90,7 @@
     "${dawn_root}/src/dawn:dawncpp",
     "${dawn_root}/src/dawn_native:dawn_native_static",
     "${dawn_root}/src/dawn_wire:dawn_wire_static",
+    "${dawn_root}/src/utils:dawn_utils",
   ]
 }
 
diff --git a/src/fuzzers/DawnWireServerFuzzer.cpp b/src/fuzzers/DawnWireServerFuzzer.cpp
index aa0da42..81be868 100644
--- a/src/fuzzers/DawnWireServerFuzzer.cpp
+++ b/src/fuzzers/DawnWireServerFuzzer.cpp
@@ -21,6 +21,7 @@
 #include "dawn/webgpu_cpp.h"
 #include "dawn_native/DawnNative.h"
 #include "dawn_wire/WireServer.h"
+#include "utils/SystemUtils.h"
 
 #include <fstream>
 #include <vector>
@@ -149,8 +150,17 @@
 
     wireServer->HandleCommands(reinterpret_cast<const char*>(data), size);
 
-    // Fake waiting for all previous commands before destroying the server.
-    device.Tick();
+    // Wait for all previous commands before destroying the server.
+    // TODO(enga): Improve this when we improve/finalize how processing events happens.
+    {
+        wgpu::Queue queue = device.GetDefaultQueue();
+        wgpu::Fence fence = queue.CreateFence();
+        queue.Signal(fence, 1u);
+        while (fence.GetCompletedValue() != 1u) {
+            device.Tick();
+            utils::USleep(100);
+        }
+    }
 
     // Destroy the server before the device because it needs to free all objects.
     wireServer = nullptr;