ipcz: Extract single-process driver base

Pulls some code out of the existing single-process reference driver
into a location which can be shared by multiple new single-process
drivers, which will only differ by transport implementation.

The driver is also renamed to the "sync" driver, since there will
soon be a second (async) single-process driver.

No functional changes here.

Bug: 1299283
Change-Id: I6e24d2dd8b9fc0636c82896de5386934ae670733
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3701023
Reviewed-by: Alex Gough <ajgo@chromium.org>
Commit-Queue: Ken Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/main@{#1017012}
NOKEYCHECK=True
GitOrigin-RevId: a947f3a0b3e46ab49fda2327275e19801e78eace
diff --git a/src/BUILD.gn b/src/BUILD.gn
index d73bb4e..90436cb 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -138,7 +138,7 @@
 
   public = [
     "reference_drivers/blob.h",
-    "reference_drivers/single_process_reference_driver.h",
+    "reference_drivers/sync_reference_driver.h",
   ]
 
   sources = [
@@ -147,7 +147,9 @@
     "reference_drivers/object.h",
     "reference_drivers/random.cc",
     "reference_drivers/random.h",
-    "reference_drivers/single_process_reference_driver.cc",
+    "reference_drivers/single_process_reference_driver_base.cc",
+    "reference_drivers/single_process_reference_driver_base.h",
+    "reference_drivers/sync_reference_driver.cc",
   ]
 
   if (enable_multiprocess_tests) {
@@ -327,7 +329,7 @@
     "ipcz/node_link_test.cc",
     "ipcz/parcel_queue_test.cc",
     "ipcz/sequenced_queue_test.cc",
-    "reference_drivers/single_process_reference_driver_test.cc",
+    "reference_drivers/sync_reference_driver_test.cc",
     "remote_portal_test.cc",
     "test/mock_driver.cc",
     "test/mock_driver.h",
diff --git a/src/api_test.cc b/src/api_test.cc
index 02407d1..ce83991 100644
--- a/src/api_test.cc
+++ b/src/api_test.cc
@@ -5,15 +5,14 @@
 #include <string>
 
 #include "ipcz/ipcz.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "test/test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace ipcz {
 namespace {
 
-const IpczDriver& kDefaultDriver =
-    reference_drivers::kSingleProcessReferenceDriver;
+const IpczDriver& kDefaultDriver = reference_drivers::kSyncReferenceDriver;
 
 using APITest = test::Test;
 
diff --git a/src/ipcz/buffer_pool_test.cc b/src/ipcz/buffer_pool_test.cc
index ea5aadd..a82dd34 100644
--- a/src/ipcz/buffer_pool_test.cc
+++ b/src/ipcz/buffer_pool_test.cc
@@ -10,7 +10,7 @@
 #include "ipcz/driver_memory.h"
 #include "ipcz/driver_memory_mapping.h"
 #include "ipcz/node.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/span.h"
 #include "util/ref_counted.h"
@@ -27,7 +27,7 @@
  private:
   const Ref<Node> node_{
       MakeRefCounted<Node>(Node::Type::kBroker,
-                           reference_drivers::kSingleProcessReferenceDriver,
+                           reference_drivers::kSyncReferenceDriver,
                            IPCZ_INVALID_DRIVER_HANDLE)};
 };
 
diff --git a/src/ipcz/node_connector_test.cc b/src/ipcz/node_connector_test.cc
index ae9733b..7bd3fe7 100644
--- a/src/ipcz/node_connector_test.cc
+++ b/src/ipcz/node_connector_test.cc
@@ -13,7 +13,7 @@
 #include "ipcz/node_messages.h"
 #include "ipcz/portal.h"
 #include "ipcz/router.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "test/test.h"
 #include "test/test_transport_listener.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -22,7 +22,7 @@
 namespace ipcz {
 namespace {
 
-const IpczDriver& kDriver = reference_drivers::kSingleProcessReferenceDriver;
+const IpczDriver& kDriver = reference_drivers::kSyncReferenceDriver;
 
 class NodeConnectorTest : public test::Test {
  protected:
diff --git a/src/ipcz/node_link_test.cc b/src/ipcz/node_link_test.cc
index 8e34c3e..8f26dd5 100644
--- a/src/ipcz/node_link_test.cc
+++ b/src/ipcz/node_link_test.cc
@@ -12,7 +12,7 @@
 #include "ipcz/remote_router_link.h"
 #include "ipcz/router.h"
 #include "ipcz/sublink_id.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/base/macros.h"
 #include "util/ref_counted.h"
@@ -20,7 +20,7 @@
 namespace ipcz {
 namespace {
 
-const IpczDriver& kDriver = reference_drivers::kSingleProcessReferenceDriver;
+const IpczDriver& kDriver = reference_drivers::kSyncReferenceDriver;
 
 std::pair<Ref<NodeLink>, Ref<NodeLink>> LinkNodes(Ref<Node> broker,
                                                   Ref<Node> non_broker) {
@@ -74,6 +74,9 @@
   router0->CloseRoute();
   EXPECT_TRUE(router1->IsPeerClosed());
   router1->CloseRoute();
+
+  link0->Deactivate();
+  link1->Deactivate();
 }
 
 }  // namespace
diff --git a/src/reference_drivers/single_process_reference_driver_base.cc b/src/reference_drivers/single_process_reference_driver_base.cc
new file mode 100644
index 0000000..f9b5cb1
--- /dev/null
+++ b/src/reference_drivers/single_process_reference_driver_base.cc
@@ -0,0 +1,187 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "reference_drivers/single_process_reference_driver_base.h"
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+#include <memory>
+#include <utility>
+
+#include "ipcz/ipcz.h"
+#include "reference_drivers/object.h"
+#include "reference_drivers/random.h"
+#include "third_party/abseil-cpp/absl/base/macros.h"
+#include "util/ref_counted.h"
+
+namespace ipcz::reference_drivers {
+
+namespace {
+
+// Shared memory objects in single-process drivers are plain heap allocations.
+class InProcessMemory : public ObjectImpl<InProcessMemory, Object::kMemory> {
+ public:
+  explicit InProcessMemory(size_t size)
+      : size_(size), data_(new uint8_t[size]) {
+    memset(&data_[0], 0, size_);
+  }
+
+  size_t size() const { return size_; }
+  void* address() const { return &data_[0]; }
+
+ private:
+  ~InProcessMemory() override = default;
+
+  const size_t size_;
+  const std::unique_ptr<uint8_t[]> data_;
+};
+
+// As there's nothing to "map" from a heap allocation, single-process driver
+// memory mappings simply hold an active reference to the underlying
+// heap allocation.
+class InProcessMapping : public ObjectImpl<InProcessMapping, Object::kMapping> {
+ public:
+  explicit InProcessMapping(Ref<InProcessMemory> memory)
+      : memory_(std::move(memory)) {}
+
+  size_t size() const { return memory_->size(); }
+  void* address() const { return memory_->address(); }
+
+ private:
+  ~InProcessMapping() override = default;
+
+  const Ref<InProcessMemory> memory_;
+};
+
+IpczResult IPCZ_API Close(IpczDriverHandle handle,
+                          uint32_t flags,
+                          const void* options) {
+  Ref<Object> object = Object::TakeFromHandle(handle);
+  if (!object) {
+    return IPCZ_RESULT_INVALID_ARGUMENT;
+  }
+
+  return object->Close();
+}
+
+IpczResult IPCZ_API Serialize(IpczDriverHandle handle,
+                              IpczDriverHandle transport,
+                              uint32_t flags,
+                              const void* options,
+                              void* data,
+                              size_t* num_bytes,
+                              IpczDriverHandle* handles,
+                              size_t* num_handles) {
+  Object* object = Object::FromHandle(handle);
+  if (!object) {
+    return IPCZ_RESULT_INVALID_ARGUMENT;
+  }
+
+  if (num_bytes) {
+    *num_bytes = 0;
+  }
+
+  // Since this is all in-process, all driver handles can be transmitted as-is.
+  const size_t handle_capacity = num_handles ? *num_handles : 0;
+  if (num_handles) {
+    *num_handles = 1;
+  }
+  if (handle_capacity < 1) {
+    return IPCZ_RESULT_RESOURCE_EXHAUSTED;
+  }
+
+  handles[0] = handle;
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult IPCZ_API Deserialize(const void* data,
+                                size_t num_bytes,
+                                const IpczDriverHandle* handles,
+                                size_t num_handles,
+                                IpczDriverHandle transport,
+                                uint32_t flags,
+                                const void* options,
+                                IpczDriverHandle* driver_handle) {
+  ABSL_ASSERT(num_bytes == 0);
+  ABSL_ASSERT(num_handles == 1);
+  *driver_handle = handles[0];
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult IPCZ_API AllocateSharedMemory(size_t num_bytes,
+                                         uint32_t flags,
+                                         const void* options,
+                                         IpczDriverHandle* driver_memory) {
+  if (num_bytes > std::numeric_limits<size_t>::max()) {
+    return IPCZ_RESULT_RESOURCE_EXHAUSTED;
+  }
+
+  auto memory = MakeRefCounted<InProcessMemory>(static_cast<size_t>(num_bytes));
+  *driver_memory = Object::ReleaseAsHandle(std::move(memory));
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult GetSharedMemoryInfo(IpczDriverHandle driver_memory,
+                               uint32_t flags,
+                               const void* options,
+                               IpczSharedMemoryInfo* info) {
+  Object* object = Object::FromHandle(driver_memory);
+  if (!object || object->type() != Object::kMemory || !info ||
+      info->size < sizeof(IpczSharedMemoryInfo)) {
+    return IPCZ_RESULT_INVALID_ARGUMENT;
+  }
+
+  info->region_num_bytes = static_cast<InProcessMemory*>(object)->size();
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult IPCZ_API DuplicateSharedMemory(IpczDriverHandle driver_memory,
+                                          uint32_t flags,
+                                          const void* options,
+                                          IpczDriverHandle* new_driver_memory) {
+  Ref<InProcessMemory> memory(InProcessMemory::FromHandle(driver_memory));
+  *new_driver_memory = Object::ReleaseAsHandle(std::move(memory));
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult IPCZ_API MapSharedMemory(IpczDriverHandle driver_memory,
+                                    uint32_t flags,
+                                    const void* options,
+                                    void** address,
+                                    IpczDriverHandle* driver_mapping) {
+  Ref<InProcessMemory> memory(InProcessMemory::FromHandle(driver_memory));
+  auto mapping = MakeRefCounted<InProcessMapping>(std::move(memory));
+  *address = mapping->address();
+  *driver_mapping = Object::ReleaseAsHandle(std::move(mapping));
+  return IPCZ_RESULT_OK;
+}
+
+IpczResult IPCZ_API GenerateRandomBytes(size_t num_bytes,
+                                        uint32_t flags,
+                                        const void* options,
+                                        void* buffer) {
+  RandomBytes(absl::MakeSpan(static_cast<uint8_t*>(buffer), num_bytes));
+  return IPCZ_RESULT_OK;
+}
+
+}  // namespace
+
+const IpczDriver kSingleProcessReferenceDriverBase = {
+    sizeof(kSingleProcessReferenceDriverBase),
+    Close,
+    Serialize,
+    Deserialize,
+    nullptr,
+    nullptr,
+    nullptr,
+    nullptr,
+    AllocateSharedMemory,
+    GetSharedMemoryInfo,
+    DuplicateSharedMemory,
+    MapSharedMemory,
+    GenerateRandomBytes,
+};
+
+}  // namespace ipcz::reference_drivers
diff --git a/src/reference_drivers/single_process_reference_driver_base.h b/src/reference_drivers/single_process_reference_driver_base.h
new file mode 100644
index 0000000..e0e89b5
--- /dev/null
+++ b/src/reference_drivers/single_process_reference_driver_base.h
@@ -0,0 +1,18 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_REFERENCE_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_BASE_H_
+#define IPCZ_SRC_REFERENCE_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_BASE_H_
+
+#include "ipcz/ipcz.h"
+
+namespace ipcz::reference_drivers {
+
+// A partial IpczDriver providing implementation common to both the sync and
+// and async single-process drivers.
+extern const IpczDriver kSingleProcessReferenceDriverBase;
+
+}  // namespace ipcz::reference_drivers
+
+#endif  // IPCZ_SRC_REFERENCE_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_BASE_H_
diff --git a/src/reference_drivers/single_process_reference_driver.cc b/src/reference_drivers/sync_reference_driver.cc
similarity index 65%
rename from src/reference_drivers/single_process_reference_driver.cc
rename to src/reference_drivers/sync_reference_driver.cc
index 888d4f5..af9c0bc 100644
--- a/src/reference_drivers/single_process_reference_driver.cc
+++ b/src/reference_drivers/sync_reference_driver.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 
 #include <algorithm>
 #include <cstdint>
@@ -12,12 +12,10 @@
 #include <tuple>
 #include <vector>
 
-#include "ipcz/driver_object.h"
-#include "ipcz/driver_transport.h"
 #include "ipcz/ipcz.h"
-#include "ipcz/message.h"
 #include "reference_drivers/object.h"
 #include "reference_drivers/random.h"
+#include "reference_drivers/single_process_reference_driver_base.h"
 #include "third_party/abseil-cpp/absl/synchronization/mutex.h"
 #include "third_party/abseil-cpp/absl/types/span.h"
 #include "util/ref_counted.h"
@@ -161,28 +159,12 @@
     }
 
     if (peer) {
-      // Kind of a hack so we can deserialize messages as if they were read
-      // and deserialized by the peer. We want to do this because the serialized
-      // messages may encode driver objects with live resources that would
-      // otherwise leak. This is particularly problematic in test environments
-      // where we want to exercise various edge cases that can result in
-      // dropped connections and dropped messages, within a single test process
-      // that may run multiple such tests in succession.
-      //
-      // We construct a temporary DriverObject which wraps `this`, as needed
-      // for Message deserialization. This must be released when done, as it
-      // does not actually own a handle to the peer.
-      auto peer_transport = MakeRefCounted<DriverTransport>(
-          DriverObject(kSingleProcessReferenceDriver, peer->handle()));
       for (SavedMessage& m : saved_messages) {
-        ipcz::Message message;
-        message.DeserializeUnknownType(
-            ipcz::DriverTransport::RawMessage{m.data, m.handles},
-            *peer_transport);
+        for (IpczDriverHandle handle : m.handles) {
+          Object::TakeFromHandle(handle)->Close();
+        }
       }
 
-      std::ignore = peer_transport->Release();
-
       // NOTE: Although nothing should ever call back into `this` after Close(),
       // for consistency with other methods we still take precaution not to call
       // into the peer while holding `mutex_`.
@@ -337,94 +319,6 @@
   std::vector<SavedMessage> saved_messages_ ABSL_GUARDED_BY(mutex_);
 };
 
-// Shared memory regions for the single-process driver are just regular private
-// heap allocations.
-class InProcessMemory : public ObjectImpl<InProcessMemory, Object::kMemory> {
- public:
-  explicit InProcessMemory(size_t size)
-      : size_(size), data_(new uint8_t[size]) {
-    memset(&data_[0], 0, size_);
-  }
-
-  size_t size() const { return size_; }
-  void* address() const { return &data_[0]; }
-
- private:
-  ~InProcessMemory() override = default;
-
-  const size_t size_;
-  const std::unique_ptr<uint8_t[]> data_;
-};
-
-class InProcessMapping : public ObjectImpl<InProcessMapping, Object::kMapping> {
- public:
-  explicit InProcessMapping(Ref<InProcessMemory> memory)
-      : memory_(std::move(memory)) {}
-
-  size_t size() const { return memory_->size(); }
-  void* address() const { return memory_->address(); }
-
- private:
-  ~InProcessMapping() override = default;
-
-  const Ref<InProcessMemory> memory_;
-};
-
-IpczResult IPCZ_API Close(IpczDriverHandle handle,
-                          uint32_t flags,
-                          const void* options) {
-  Ref<Object> object = Object::TakeFromHandle(handle);
-  if (!object) {
-    return IPCZ_RESULT_INVALID_ARGUMENT;
-  }
-
-  return object->Close();
-}
-
-IpczResult IPCZ_API Serialize(IpczDriverHandle handle,
-                              IpczDriverHandle transport,
-                              uint32_t flags,
-                              const void* options,
-                              void* data,
-                              size_t* num_bytes,
-                              IpczDriverHandle* handles,
-                              size_t* num_handles) {
-  Object* object = Object::FromHandle(handle);
-  if (!object) {
-    return IPCZ_RESULT_INVALID_ARGUMENT;
-  }
-
-  if (num_bytes) {
-    *num_bytes = 0;
-  }
-
-  // Since this is all in-process, all driver handles can be transmitted as-is.
-  const size_t handle_capacity = num_handles ? *num_handles : 0;
-  if (num_handles) {
-    *num_handles = 1;
-  }
-  if (handle_capacity < 1) {
-    return IPCZ_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  handles[0] = handle;
-  return IPCZ_RESULT_OK;
-}
-
-IpczResult IPCZ_API Deserialize(const void* data,
-                                size_t num_bytes,
-                                const IpczDriverHandle* handles,
-                                size_t num_handles,
-                                IpczDriverHandle transport,
-                                uint32_t flags,
-                                const void* options,
-                                IpczDriverHandle* driver_handle) {
-  ABSL_ASSERT(num_bytes == 0);
-  ABSL_ASSERT(num_handles == 1);
-  *driver_handle = handles[0];
-  return IPCZ_RESULT_OK;
-}
-
 IpczResult IPCZ_API CreateTransports(IpczDriverHandle transport0,
                                      IpczDriverHandle transport1,
                                      uint32_t flags,
@@ -468,78 +362,22 @@
                  absl::MakeSpan(handles, num_handles));
 }
 
-IpczResult IPCZ_API AllocateSharedMemory(size_t num_bytes,
-                                         uint32_t flags,
-                                         const void* options,
-                                         IpczDriverHandle* driver_memory) {
-  if (num_bytes > std::numeric_limits<size_t>::max()) {
-    return IPCZ_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  auto memory = MakeRefCounted<InProcessMemory>(static_cast<size_t>(num_bytes));
-  *driver_memory = Object::ReleaseAsHandle(std::move(memory));
-  return IPCZ_RESULT_OK;
-}
-
-IpczResult GetSharedMemoryInfo(IpczDriverHandle driver_memory,
-                               uint32_t flags,
-                               const void* options,
-                               IpczSharedMemoryInfo* info) {
-  Object* object = Object::FromHandle(driver_memory);
-  if (!object || object->type() != Object::kMemory || !info ||
-      info->size < sizeof(IpczSharedMemoryInfo)) {
-    return IPCZ_RESULT_INVALID_ARGUMENT;
-  }
-
-  info->region_num_bytes = static_cast<InProcessMemory*>(object)->size();
-  return IPCZ_RESULT_OK;
-}
-
-IpczResult IPCZ_API DuplicateSharedMemory(IpczDriverHandle driver_memory,
-                                          uint32_t flags,
-                                          const void* options,
-                                          IpczDriverHandle* new_driver_memory) {
-  Ref<InProcessMemory> memory(InProcessMemory::FromHandle(driver_memory));
-  *new_driver_memory = Object::ReleaseAsHandle(std::move(memory));
-  return IPCZ_RESULT_OK;
-}
-
-IpczResult IPCZ_API MapSharedMemory(IpczDriverHandle driver_memory,
-                                    uint32_t flags,
-                                    const void* options,
-                                    void** address,
-                                    IpczDriverHandle* driver_mapping) {
-  Ref<InProcessMemory> memory(InProcessMemory::FromHandle(driver_memory));
-  auto mapping = MakeRefCounted<InProcessMapping>(std::move(memory));
-  *address = mapping->address();
-  *driver_mapping = Object::ReleaseAsHandle(std::move(mapping));
-  return IPCZ_RESULT_OK;
-}
-
-IpczResult IPCZ_API GenerateRandomBytes(size_t num_bytes,
-                                        uint32_t flags,
-                                        const void* options,
-                                        void* buffer) {
-  RandomBytes(absl::MakeSpan(static_cast<uint8_t*>(buffer), num_bytes));
-  return IPCZ_RESULT_OK;
-}
-
 }  // namespace
 
-const IpczDriver kSingleProcessReferenceDriver = {
-    sizeof(kSingleProcessReferenceDriver),
-    Close,
-    Serialize,
-    Deserialize,
+const IpczDriver kSyncReferenceDriver = {
+    sizeof(kSyncReferenceDriver),
+    kSingleProcessReferenceDriverBase.Close,
+    kSingleProcessReferenceDriverBase.Serialize,
+    kSingleProcessReferenceDriverBase.Deserialize,
     CreateTransports,
     ActivateTransport,
     DeactivateTransport,
     Transmit,
-    AllocateSharedMemory,
-    GetSharedMemoryInfo,
-    DuplicateSharedMemory,
-    MapSharedMemory,
-    GenerateRandomBytes,
+    kSingleProcessReferenceDriverBase.AllocateSharedMemory,
+    kSingleProcessReferenceDriverBase.GetSharedMemoryInfo,
+    kSingleProcessReferenceDriverBase.DuplicateSharedMemory,
+    kSingleProcessReferenceDriverBase.MapSharedMemory,
+    kSingleProcessReferenceDriverBase.GenerateRandomBytes,
 };
 
 }  // namespace ipcz::reference_drivers
diff --git a/src/reference_drivers/single_process_reference_driver.h b/src/reference_drivers/sync_reference_driver.h
similarity index 69%
rename from src/reference_drivers/single_process_reference_driver.h
rename to src/reference_drivers/sync_reference_driver.h
index fbd139e..4dd4c26 100644
--- a/src/reference_drivers/single_process_reference_driver.h
+++ b/src/reference_drivers/sync_reference_driver.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IPCZ_SRC_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_H_
-#define IPCZ_SRC_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_H_
+#ifndef IPCZ_SRC_REFERENCE_DRIVERS_SYNC_REFERENCE_DRIVER_H_
+#define IPCZ_SRC_REFERENCE_DRIVERS_SYNC_REFERENCE_DRIVER_H_
 
 #include "ipcz/ipcz.h"
 
@@ -13,8 +13,8 @@
 // on one transport directly calls into the activity handler of its peer, so all
 // node operations and therefore all ipcz operations complete synchronously from
 // end to end.
-extern const IpczDriver kSingleProcessReferenceDriver;
+extern const IpczDriver kSyncReferenceDriver;
 
 }  // namespace ipcz::reference_drivers
 
-#endif  // IPCZ_SRC_DRIVERS_SINGLE_PROCESS_REFERENCE_DRIVER_H_
+#endif  // IPCZ_SRC_REFERENCE_DRIVERS_SYNC_REFERENCE_DRIVER_H_
diff --git a/src/reference_drivers/single_process_reference_driver_test.cc b/src/reference_drivers/sync_reference_driver_test.cc
similarity index 92%
rename from src/reference_drivers/single_process_reference_driver_test.cc
rename to src/reference_drivers/sync_reference_driver_test.cc
index 3381ee3..2ec1f9a 100644
--- a/src/reference_drivers/single_process_reference_driver_test.cc
+++ b/src/reference_drivers/sync_reference_driver_test.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 
 #include <cstddef>
 #include <functional>
@@ -77,8 +77,8 @@
   const TransportHandlers handlers_;
 };
 
-TEST(SingleProcessReferenceDriverTest, CreateTransports) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, CreateTransports) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -88,8 +88,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, TransmitBeforeActive) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, TransmitBeforeActive) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -122,8 +122,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, TransmitWhileActive) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, TransmitWhileActive) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -155,8 +155,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, Deactivate) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, Deactivate) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -179,8 +179,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, TransmitAfterDeactivated) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, TransmitAfterDeactivated) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -217,8 +217,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, NotifyError) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, NotifyError) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
@@ -255,8 +255,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(b, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, SharedMemory) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, SharedMemory) {
+  const IpczDriver& driver = kSyncReferenceDriver;
 
   const size_t kSize = 64;
   IpczDriverHandle memory;
@@ -297,8 +297,8 @@
   EXPECT_EQ(IPCZ_RESULT_OK, driver.Close(memory, IPCZ_NO_FLAGS, nullptr));
 }
 
-TEST(SingleProcessReferenceDriverTest, TransmitHandles) {
-  const IpczDriver& driver = kSingleProcessReferenceDriver;
+TEST(SyncReferenceDriverTest, TransmitHandles) {
+  const IpczDriver& driver = kSyncReferenceDriver;
   IpczDriverHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             driver.CreateTransports(IPCZ_INVALID_DRIVER_HANDLE,
diff --git a/src/test/multinode_test.cc b/src/test/multinode_test.cc
index ed24c24..91a1059 100644
--- a/src/test/multinode_test.cc
+++ b/src/test/multinode_test.cc
@@ -9,7 +9,7 @@
 #include <thread>
 
 #include "ipcz/ipcz.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "third_party/abseil-cpp/absl/base/macros.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
@@ -112,7 +112,7 @@
   static IpczDriver kInvalidDriver = {};
   switch (driver_mode_) {
     case DriverMode::kSync:
-      return reference_drivers::kSingleProcessReferenceDriver;
+      return reference_drivers::kSyncReferenceDriver;
 
 #if BUILDFLAG(ENABLE_IPCZ_MULTIPROCESS_TESTS)
     case DriverMode::kMultiprocess:
diff --git a/src/trap_test.cc b/src/trap_test.cc
index cf30087..5c2f537 100644
--- a/src/trap_test.cc
+++ b/src/trap_test.cc
@@ -6,7 +6,7 @@
 #include <utility>
 
 #include "ipcz/ipcz.h"
-#include "reference_drivers/single_process_reference_driver.h"
+#include "reference_drivers/sync_reference_driver.h"
 #include "test/test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/memory/memory.h"
@@ -23,8 +23,7 @@
   }
 
  private:
-  const IpczHandle node_{
-      CreateNode(reference_drivers::kSingleProcessReferenceDriver)};
+  const IpczHandle node_{CreateNode(reference_drivers::kSyncReferenceDriver)};
 };
 
 TEST_F(TrapTest, RemoveOnClose) {