WireServer: Wrap userdata in unique_ptr in callbacks

This fixes a leak that was introduced in
https://dawn-review.googlesource.com/c/dawn/+/3622 where the early
return doesn't delete the userdata.

BUG=chromium:921360

Change-Id: I500dd2b4fa02121e5c0278c5f6f83a30861815e4
Reviewed-on: https://dawn-review.googlesource.com/c/3942
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/generator/templates/dawn_wire/WireServer.cpp b/generator/templates/dawn_wire/WireServer.cpp
index 49a9f71..e186a42 100644
--- a/generator/templates/dawn_wire/WireServer.cpp
+++ b/generator/templates/dawn_wire/WireServer.cpp
@@ -22,6 +22,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <map>
+#include <memory>
 #include <vector>
 
 namespace dawn_wire {
@@ -334,7 +335,9 @@
                     }
                 {% endfor %}
 
-                void OnMapReadAsyncCallback(dawnBufferMapAsyncStatus status, const void* ptr, MapUserdata* data) {
+                void OnMapReadAsyncCallback(dawnBufferMapAsyncStatus status, const void* ptr, MapUserdata* userdata) {
+                    std::unique_ptr<MapUserdata> data(userdata);
+
                     // Skip sending the callback if the buffer has already been destroyed.
                     auto* bufferData = mKnownBuffer.Get(data->bufferId);
                     if (bufferData == nullptr || bufferData->serial != data->bufferSerial) {
@@ -357,11 +360,11 @@
                         void* dataAlloc = GetCmdSpace(data->size);
                         memcpy(dataAlloc, ptr, data->size);
                     }
-
-                    delete data;
                 }
 
-                void OnMapWriteAsyncCallback(dawnBufferMapAsyncStatus status, void* ptr, MapUserdata* data) {
+                void OnMapWriteAsyncCallback(dawnBufferMapAsyncStatus status, void* ptr, MapUserdata* userdata) {
+                    std::unique_ptr<MapUserdata> data(userdata);
+
                     // Skip sending the callback if the buffer has already been destroyed.
                     auto* bufferData = mKnownBuffer.Get(data->bufferId);
                     if (bufferData == nullptr || bufferData->serial != data->bufferSerial) {
@@ -381,11 +384,11 @@
                         bufferData->mappedData = ptr;
                         bufferData->mappedDataSize = data->size;
                     }
-
-                    delete data;
                 }
 
-                void OnFenceCompletedValueUpdated(FenceCompletionUserdata* data) {
+                void OnFenceCompletedValueUpdated(FenceCompletionUserdata* userdata) {
+                    std::unique_ptr<FenceCompletionUserdata> data(userdata);
+
                     ReturnFenceUpdateCompletedValueCmd cmd;
                     cmd.fenceId = data->fenceId;
                     cmd.fenceSerial = data->fenceSerial;
@@ -393,8 +396,6 @@
 
                     auto allocCmd = static_cast<ReturnFenceUpdateCompletedValueCmd*>(GetCmdSpace(sizeof(cmd)));
                     *allocCmd = cmd;
-
-                    delete data;
                 }
 
                 {% set client_side_commands = ["FenceGetCompletedValue"] %}