Updates socket_forward_region_view for ag/3486191

Open() is now protected, I copied the pattern from the above change.

BUG: 72181993
BUG: 72654144
Change-Id: I38b1a3326a808c01a83c25f56cb9cce859d08fc7
diff --git a/common/commands/socket_forward_proxy/main.cpp b/common/commands/socket_forward_proxy/main.cpp
index ca70fae..4be4588 100644
--- a/common/commands/socket_forward_proxy/main.cpp
+++ b/common/commands/socket_forward_proxy/main.cpp
@@ -153,14 +153,16 @@
 }
 #endif
 
-void OpenShm(vsoc::socket_forward::SocketForwardRegionView* shm_ptr) {
-  if (!shm_ptr->Open(
+std::shared_ptr<SocketForwardRegionView> GetShm() {
+  auto shm = SocketForwardRegionView::GetInstance(
 #ifdef CUTTLEFISH_HOST
-          vsoc::GetDomain().c_str()
+      vsoc::GetDomain().c_str()
 #endif
-              )) {
+  );
+  if (!shm) {
     LOG(FATAL) << "Could not open SHM. Aborting.";
   }
+  return shm;
 }
 
 // makes sure we're running as root on the guest, no-op on the host
@@ -176,14 +178,13 @@
   gflags::ParseCommandLineFlags(&argc, &argv, true);
   assert_correct_user();
 
-  vsoc::socket_forward::SocketForwardRegionView shm{};
-  OpenShm(&shm);
-  auto worker = shm.StartWorker();
+  auto shm = GetShm();
+  auto worker = shm->StartWorker();
 
 #ifdef CUTTLEFISH_HOST
   CHECK_NE(FLAGS_port, 0u) << "Must specify --port flag";
-  host(&shm, FLAGS_port);
+  host(shm.get(), FLAGS_port);
 #else
-  guest(&shm);
+  guest(shm.get());
 #endif
 }
diff --git a/common/vsoc/lib/socket_forward_region_view.cpp b/common/vsoc/lib/socket_forward_region_view.cpp
index b56dde4..cf95fa9 100644
--- a/common/vsoc/lib/socket_forward_region_view.cpp
+++ b/common/vsoc/lib/socket_forward_region_view.cpp
@@ -186,6 +186,23 @@
   return {-1, -1};
 }
 
+#if defined(CUTTLEFISH_HOST)
+std::shared_ptr<SocketForwardRegionView> SocketForwardRegionView::GetInstance(
+    const char* domain) {
+  return RegionView::GetInstanceImpl<SocketForwardRegionView>(
+      [](std::shared_ptr<SocketForwardRegionView> region, const char* domain) {
+        return region->Open(domain);
+      },
+      domain);
+}
+#else
+std::shared_ptr<SocketForwardRegionView> SocketForwardRegionView::GetInstance()
+{
+  return RegionView::GetInstanceImpl<SocketForwardRegionView>(
+      std::mem_fn(&SocketForwardRegionView::Open));
+}
+#endif
+
 #ifdef CUTTLEFISH_HOST
 SocketForwardRegionView::Connection SocketForwardRegionView::OpenConnection(
     int port) {
diff --git a/common/vsoc/lib/socket_forward_region_view.h b/common/vsoc/lib/socket_forward_region_view.h
index 2930aba..0471a5f 100644
--- a/common/vsoc/lib/socket_forward_region_view.h
+++ b/common/vsoc/lib/socket_forward_region_view.h
@@ -154,6 +154,12 @@
   SocketForwardRegionView(const SocketForwardRegionView&) = delete;
   SocketForwardRegionView& operator=(const SocketForwardRegionView&) = delete;
 
+  static std::shared_ptr<SocketForwardRegionView> GetInstance(
+#ifdef CUTTLEFISH_HOST
+    const char* domain
+#endif
+  );
+
 #ifdef CUTTLEFISH_HOST
   Connection OpenConnection(int port);
 #else