dawn_wire: Move manual class members from ServerBase to Server

Bug: dawn:88
Change-Id: Ic216006aa52cace7aa7451b957e72119783e6d7a
Reviewed-on: https://dawn-review.googlesource.com/c/4100
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/generator/templates/dawn_wire/server/ServerBase.h b/generator/templates/dawn_wire/server/ServerBase.h
index 97a5be0..cc98f62 100644
--- a/generator/templates/dawn_wire/server/ServerBase.h
+++ b/generator/templates/dawn_wire/server/ServerBase.h
@@ -22,50 +22,43 @@
 
 namespace dawn_wire { namespace server {
 
-    class Server;
-
-    struct MapUserdata {
-        Server* server;
-        ObjectHandle buffer;
-        uint32_t requestSerial;
-        uint32_t size;
-        bool isWrite;
-    };
-
-    struct FenceCompletionUserdata {
-        Server* server;
-        ObjectHandle fence;
-        uint64_t value;
-    };
-
     class ServerBase : public ObjectIdResolver {
       public:
-        ServerBase(dawnDevice device, const dawnProcTable& procs, CommandSerializer* serializer)
-            : mProcs(procs), mSerializer(serializer) {
-        }
+        ServerBase() = default;
+        virtual ~ServerBase() = default;
 
-        virtual ~ServerBase() {
-            //* Free all objects when the server is destroyed
+      protected:
+        void DestroyAllObjects(const dawnProcTable& procs) {
+          //* Free all objects when the server is destroyed
             {% for type in by_category["object"] if type.name.canonical_case() != "device" %}
                 {
                     std::vector<{{as_cType(type.name)}}> handles = mKnown{{type.name.CamelCase()}}.AcquireAllHandles();
                     for ({{as_cType(type.name)}} handle : handles) {
-                        mProcs.{{as_varName(type.name, Name("release"))}}(handle);
+                        procs.{{as_varName(type.name, Name("release"))}}(handle);
                     }
                 }
             {% endfor %}
         }
 
-      protected:
-        dawnProcTable mProcs;
-        CommandSerializer* mSerializer = nullptr;
+        {% for type in by_category["object"] %}
+            const KnownObjects<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}Objects() const {
+                return mKnown{{type.name.CamelCase()}};
+            }
+            KnownObjects<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}Objects() {
+                return mKnown{{type.name.CamelCase()}};
+            }
+        {% endfor %}
 
-        WireDeserializeAllocator mAllocator;
+        {% for type in by_category["object"] if type.name.CamelCase() in server_reverse_lookup_objects %}
+            const ObjectIdLookupTable<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}ObjectIdTable() const {
+                return m{{type.name.CamelCase()}}IdTable;
+            }
+            ObjectIdLookupTable<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}ObjectIdTable() {
+                return m{{type.name.CamelCase()}}IdTable;
+            }
+        {% endfor %}
 
-        void* GetCmdSpace(size_t size) {
-            return mSerializer->GetCmdSpace(size);
-        }
-
+      private:
         // Implementation of the ObjectIdResolver interface
         {% for type in by_category["object"] %}
             DeserializeResult GetFromId(ObjectId id, {{as_cType(type.name)}}* out) const final {
diff --git a/generator/templates/dawn_wire/server/ServerCallbacks.cpp b/generator/templates/dawn_wire/server/ServerCallbacks.cpp
index 4a7e884..ecb52cc 100644
--- a/generator/templates/dawn_wire/server/ServerCallbacks.cpp
+++ b/generator/templates/dawn_wire/server/ServerCallbacks.cpp
@@ -28,7 +28,7 @@
     {% for type in by_category["object"] if type.is_builder%}
         {% set Type = type.name.CamelCase() %}
         void Server::On{{Type}}Error(dawnBuilderErrorStatus status, const char* message, uint32_t id, uint32_t serial) {
-            auto* builder = mKnown{{Type}}.Get(id);
+            auto* builder = {{Type}}Objects().Get(id);
 
             if (builder == nullptr || builder->serial != serial) {
                 return;
diff --git a/generator/templates/dawn_wire/server/ServerHandlers.cpp b/generator/templates/dawn_wire/server/ServerHandlers.cpp
index 3c9163b..096d9a2 100644
--- a/generator/templates/dawn_wire/server/ServerHandlers.cpp
+++ b/generator/templates/dawn_wire/server/ServerHandlers.cpp
@@ -37,7 +37,7 @@
                     {% endif %}
 
                     //* Unpack 'self'
-                    auto* selfData = mKnown{{type.name.CamelCase()}}.Get(cmd.selfId);
+                    auto* selfData = {{type.name.CamelCase()}}Objects().Get(cmd.selfId);
                     ASSERT(selfData != nullptr);
 
                     //* In all cases allocate the object data as it will be refered-to by the client.
@@ -45,7 +45,7 @@
                     {% set returns = return_type.name.canonical_case() != "void" %}
                     {% if returns %}
                         {% set Type = method.return_type.name.CamelCase() %}
-                        auto* resultData = mKnown{{Type}}.Allocate(cmd.result.id);
+                        auto* resultData = {{Type}}Objects().Allocate(cmd.result.id);
                         if (resultData == nullptr) {
                             return false;
                         }
@@ -90,7 +90,7 @@
                         {% if return_type.name.CamelCase() in server_reverse_lookup_objects %}
                             //* For created objects, store a mapping from them back to their client IDs
                             if (result) {
-                                m{{return_type.name.CamelCase()}}IdTable.Store(result, cmd.result.id);
+                                {{return_type.name.CamelCase()}}ObjectIdTable().Store(result, cmd.result.id);
                             }
                         {% endif %}
 
@@ -133,19 +133,19 @@
                         //* Freeing the device has to be done out of band.
                         return false;
                     {% else %}
-                        auto* data = mKnown{{type.name.CamelCase()}}.Get(objectId);
+                        auto* data = {{type.name.CamelCase()}}Objects().Get(objectId);
                         if (data == nullptr) {
                             return false;
                         }
                         {% if type.name.CamelCase() in server_reverse_lookup_objects %}
-                            m{{type.name.CamelCase()}}IdTable.Remove(data->handle);
+                            {{type.name.CamelCase()}}ObjectIdTable().Remove(data->handle);
                         {% endif %}
 
                         if (data->handle != nullptr) {
                             mProcs.{{as_varName(type.name, Name("release"))}}(data->handle);
                         }
 
-                        mKnown{{type.name.CamelCase()}}.Free(objectId);
+                        {{type.name.CamelCase()}}Objects().Free(objectId);
                         return true;
                     {% endif %}
                 }
@@ -156,7 +156,7 @@
     }
 
     const char* Server::HandleCommands(const char* commands, size_t size) {
-        mProcs.deviceTick(mKnownDevice.Get(1)->handle);
+        mProcs.deviceTick(DeviceObjects().Get(1)->handle);
 
         while (size >= sizeof(WireCmd)) {
             WireCmd cmdId = *reinterpret_cast<const WireCmd*>(commands);
diff --git a/src/dawn_wire/server/Server.cpp b/src/dawn_wire/server/Server.cpp
index c1373ce..352e5d5 100644
--- a/src/dawn_wire/server/Server.cpp
+++ b/src/dawn_wire/server/Server.cpp
@@ -17,9 +17,9 @@
 namespace dawn_wire { namespace server {
 
     Server::Server(dawnDevice device, const dawnProcTable& procs, CommandSerializer* serializer)
-        : ServerBase(device, procs, serializer) {
+        : mSerializer(serializer), mProcs(procs) {
         // The client-server knowledge is bootstrapped with device 1.
-        auto* deviceData = mKnownDevice.Allocate(1);
+        auto* deviceData = DeviceObjects().Allocate(1);
         deviceData->handle = device;
         deviceData->valid = true;
 
@@ -28,6 +28,11 @@
     }
 
     Server::~Server() {
+        DestroyAllObjects(mProcs);
+    }
+
+    void* Server::GetCmdSpace(size_t size) {
+        return mSerializer->GetCmdSpace(size);
     }
 
 }}  // namespace dawn_wire::server
diff --git a/src/dawn_wire/server/Server.h b/src/dawn_wire/server/Server.h
index 9f38db1..0e0cb77 100644
--- a/src/dawn_wire/server/Server.h
+++ b/src/dawn_wire/server/Server.h
@@ -19,6 +19,22 @@
 
 namespace dawn_wire { namespace server {
 
+    class Server;
+
+    struct MapUserdata {
+        Server* server;
+        ObjectHandle buffer;
+        uint32_t requestSerial;
+        uint32_t size;
+        bool isWrite;
+    };
+
+    struct FenceCompletionUserdata {
+        Server* server;
+        ObjectHandle fence;
+        uint64_t value;
+    };
+
     class Server : public ServerBase, public CommandHandler {
       public:
         Server(dawnDevice device, const dawnProcTable& procs, CommandSerializer* serializer);
@@ -27,6 +43,8 @@
         const char* HandleCommands(const char* commands, size_t size);
 
       private:
+        void* GetCmdSpace(size_t size);
+
         // Forwarding callbacks
         static void ForwardDeviceErrorToServer(const char* message, dawnCallbackUserdata userdata);
         static void ForwardBufferMapReadAsync(dawnBufferMapAsyncStatus status,
@@ -56,6 +74,10 @@
         bool HandleDestroyObject(const char** commands, size_t* size);
 
 #include "dawn_wire/server/ServerPrototypes_autogen.inl"
+
+        CommandSerializer* mSerializer = nullptr;
+        WireDeserializeAllocator mAllocator;
+        dawnProcTable mProcs;
     };
 
 }}  // namespace dawn_wire::server
diff --git a/src/dawn_wire/server/ServerBuffer.cpp b/src/dawn_wire/server/ServerBuffer.cpp
index dda48e1..7576993 100644
--- a/src/dawn_wire/server/ServerBuffer.cpp
+++ b/src/dawn_wire/server/ServerBuffer.cpp
@@ -20,7 +20,7 @@
 namespace dawn_wire { namespace server {
 
     bool Server::PreHandleBufferUnmap(const BufferUnmapCmd& cmd) {
-        auto* selfData = mKnownBuffer.Get(cmd.selfId);
+        auto* selfData = BufferObjects().Get(cmd.selfId);
         ASSERT(selfData != nullptr);
 
         selfData->mappedData = nullptr;
@@ -49,7 +49,7 @@
             return false;
         }
 
-        auto* buffer = mKnownBuffer.Get(bufferId);
+        auto* buffer = BufferObjects().Get(bufferId);
         if (buffer == nullptr) {
             return false;
         }
@@ -100,7 +100,7 @@
             return false;
         }
 
-        auto* buffer = mKnownBuffer.Get(bufferId);
+        auto* buffer = BufferObjects().Get(bufferId);
         if (buffer == nullptr || !buffer->valid || buffer->mappedData == nullptr ||
             buffer->mappedDataSize != dataLength) {
             return false;
@@ -133,7 +133,7 @@
         std::unique_ptr<MapUserdata> data(userdata);
 
         // Skip sending the callback if the buffer has already been destroyed.
-        auto* bufferData = mKnownBuffer.Get(data->buffer.id);
+        auto* bufferData = BufferObjects().Get(data->buffer.id);
         if (bufferData == nullptr || bufferData->serial != data->buffer.serial) {
             return;
         }
@@ -160,7 +160,7 @@
         std::unique_ptr<MapUserdata> data(userdata);
 
         // Skip sending the callback if the buffer has already been destroyed.
-        auto* bufferData = mKnownBuffer.Get(data->buffer.id);
+        auto* bufferData = BufferObjects().Get(data->buffer.id);
         if (bufferData == nullptr || bufferData->serial != data->buffer.serial) {
             return;
         }
diff --git a/src/dawn_wire/server/ServerQueue.cpp b/src/dawn_wire/server/ServerQueue.cpp
index 6c125b6..b347f09 100644
--- a/src/dawn_wire/server/ServerQueue.cpp
+++ b/src/dawn_wire/server/ServerQueue.cpp
@@ -21,9 +21,9 @@
         if (cmd.fence == nullptr) {
             return false;
         }
-        ObjectId fenceId = mFenceIdTable.Get(cmd.fence);
+        ObjectId fenceId = FenceObjectIdTable().Get(cmd.fence);
         ASSERT(fenceId != 0);
-        auto* fence = mKnownFence.Get(fenceId);
+        auto* fence = FenceObjects().Get(fenceId);
         ASSERT(fence != nullptr);
 
         auto* data = new FenceCompletionUserdata;