Convert Sides to a sized union

Test: Local build
Change-Id: I26ffd07b5f3dda827bc5984709d162f7094c6b4c
diff --git a/common/vsoc/lib/circqueue_impl.h b/common/vsoc/lib/circqueue_impl.h
index f228cbb..8b0fa90 100644
--- a/common/vsoc/lib/circqueue_impl.h
+++ b/common/vsoc/lib/circqueue_impl.h
@@ -124,9 +124,7 @@
   this->CopyOutRange(t, buffer_out);
   this->r_released_ = t.end_idx;
   this->lock_.Unlock();
-  layout::Sides side;
-  side.value_ = layout::Sides::Both;
-  r->SendSignal(side, &this->r_released_);
+  r->SendSignal(layout::Sides::Both, &this->r_released_);
   return t.end_idx - t.start_idx;
 }
 
@@ -146,9 +144,7 @@
   // published.
   this->w_pub_ = range.end_idx;
   this->lock_.Unlock();
-  layout::Sides side;
-  side.value_ = layout::Sides::Both;
-  r->SendSignal(side, &this->w_pub_);
+  r->SendSignal(layout::Sides::Both, &this->w_pub_);
   return bytes;
 }
 
@@ -175,9 +171,7 @@
   this->CopyOutRange(t, buffer_out);
   this->r_released_ += this->CalculateBufferedSize(packet_size);
   this->lock_.Unlock();
-  layout::Sides side;
-  side.value_ = layout::Sides::Both;
-  r->SendSignal(side, &this->r_released_);
+  r->SendSignal(layout::Sides::Both, &this->r_released_);
   return packet_size;
 }
 
@@ -232,9 +226,7 @@
 
   this->w_pub_ = range.end_idx;
   this->lock_.Unlock();
-  layout::Sides side;
-  side.value_ = layout::Sides::Both;
-  r->SendSignal(side, &this->w_pub_);
+  r->SendSignal(layout::Sides::Both, &this->w_pub_);
   return bytes;
 }
 
diff --git a/common/vsoc/lib/lock_common.cpp b/common/vsoc/lib/lock_common.cpp
index 7825011..c100574 100644
--- a/common/vsoc/lib/lock_common.cpp
+++ b/common/vsoc/lib/lock_common.cpp
@@ -121,9 +121,16 @@
     LOG(FATAL) << "Lock owner of " << this << " changed from " << tid << " to "
                << expected_state << " during unlock";
   }
-  Sides rval;
-  rval.value_ = expected_state & (GuestWaitingFlag | HostWaitingFlag) >> 30;
-  return rval;
+  switch (expected_state & (GuestWaitingFlag | HostWaitingFlag)) {
+    case 0:
+      return Sides::NoSides;
+    case GuestWaitingFlag:
+      return Sides::Guest;
+    case HostWaitingFlag:
+      return Sides::Host;
+    default:
+      return Sides::Both;
+  }
 }
 
 bool vsoc::layout::WaitingLockBase::RecoverSingleSided() {
diff --git a/common/vsoc/lib/region_view.cpp b/common/vsoc/lib/region_view.cpp
index 4f222f1..e15233f 100644
--- a/common/vsoc/lib/region_view.cpp
+++ b/common/vsoc/lib/region_view.cpp
@@ -106,16 +106,16 @@
 
 void vsoc::RegionView::SendSignal(Sides sides_to_signal,
                                   std::atomic<uint32_t>* uaddr) {
-  if (sides_to_signal.value_ & Sides::Peer) {
+  if (sides_to_signal & Sides::Peer) {
     // If we should also be signalling our side set the round trip flag on
     // the futex signal.
-    bool round_trip = sides_to_signal.value_ & Sides::OurSide;
+    bool round_trip = sides_to_signal & Sides::OurSide;
     SendSignalToPeer(uaddr, round_trip);
     // Return without signaling our waiters to give the other side a chance
     // to run.
     return;
   }
-  if (sides_to_signal.value_ & Sides::OurSide) {
+  if (sides_to_signal & Sides::OurSide) {
     syscall(SYS_futex, reinterpret_cast<int32_t*>(uaddr), FUTEX_WAKE, -1,
             nullptr, nullptr, 0);
   }
diff --git a/common/vsoc/lib/screen_region_view.cpp b/common/vsoc/lib/screen_region_view.cpp
index a028dff..2a22335 100644
--- a/common/vsoc/lib/screen_region_view.cpp
+++ b/common/vsoc/lib/screen_region_view.cpp
@@ -66,9 +66,7 @@
   // Signaling while holding the lock may cause the just-awaken listener to
   // block immediately trying to acquire the lock.
   // The former is less costly and slightly less likely to happen.
-  layout::Sides side;
-  side.value_ = layout::Sides::Both;
-  SendSignal(side, &data()->seq_num);
+  SendSignal(layout::Sides::Both, &data()->seq_num);
 }
 
 int ScreenRegionView::WaitForNewFrameSince(uint32_t* last_seq_num,
diff --git a/common/vsoc/shm/base.h b/common/vsoc/shm/base.h
index abac492..2525696 100644
--- a/common/vsoc/shm/base.h
+++ b/common/vsoc/shm/base.h
@@ -58,20 +58,18 @@
  *
  * These are carefully formatted to make Guest and Host a bitfield.
  */
-struct Sides {
-  static const uint32_t NoSides = 0;
-  static const uint32_t Guest = 1;
-  static const uint32_t Host = 2;
-  static const uint32_t Both = 3;
+enum Sides : uint32_t {
+  NoSides = 0,
+  Guest = 1,
+  Host = 2,
+  Both = 3,
 #ifdef CUTTLEFISH_HOST
-  static const uint32_t OurSide = Host;
-  static const uint32_t Peer = Guest;
+  OurSide = Host,
+  Peer = Guest
 #else
-  static const uint32_t OurSide = Guest;
-  static const uint32_t Peer = Host;
+  OurSide = Guest,
+  Peer = Host
 #endif
-
-  uint32_t value_;
 };
 ASSERT_SHM_COMPATIBLE(Sides, multi_region);
 
diff --git a/guest/vsoc/lib/guest_lock.cpp b/guest/vsoc/lib/guest_lock.cpp
index 98940cb..247b48b 100644
--- a/guest/vsoc/lib/guest_lock.cpp
+++ b/guest/vsoc/lib/guest_lock.cpp
@@ -36,7 +36,7 @@
 
 void GuestLock::Unlock() {
   Sides sides_to_signal = UnlockCommon(gettid());
-  if (sides_to_signal.value_ != Sides::NoSides) {
+  if (sides_to_signal != Sides::NoSides) {
     SingleSidedSignal::Signal(&lock_uint32_);
   }
 }
diff --git a/guest/vsoc/lib/guest_region_e2e_test.cpp b/guest/vsoc/lib/guest_region_e2e_test.cpp
index 344a743..5c027b7 100644
--- a/guest/vsoc/lib/guest_region_e2e_test.cpp
+++ b/guest/vsoc/lib/guest_region_e2e_test.cpp
@@ -112,9 +112,8 @@
   // Test signals
   EXPECT_FALSE(secondary->HasIncomingInterrupt());
   LOG(INFO) << "Verified no early second signal";
-  vsoc::layout::Sides side;
-  side.value_ = vsoc::layout::Sides::Peer;
-  primary->SendSignal(side, &primary->data()->guest_to_host_signal);
+  primary->SendSignal(vsoc::layout::Sides::Peer,
+                      &primary->data()->guest_to_host_signal);
   LOG(INFO) << "Signal sent. Waiting for first signal from peer";
   primary->WaitForInterrupt();
   int count = 0;  // counts the number of signals received.
@@ -125,7 +124,8 @@
       });
   EXPECT_TRUE(count == 1);
   LOG(INFO) << "Signal received on primary region";
-  secondary->SendSignal(side, &secondary->data()->guest_to_host_signal);
+  secondary->SendSignal(vsoc::layout::Sides::Peer,
+                        &secondary->data()->guest_to_host_signal);
   LOG(INFO) << "Signal sent. Waiting for second signal from peer";
   secondary->WaitForInterrupt();
   count = 0;
diff --git a/host/vsoc/lib/host_lock.cpp b/host/vsoc/lib/host_lock.cpp
index 2d610f1..895a429 100644
--- a/host/vsoc/lib/host_lock.cpp
+++ b/host/vsoc/lib/host_lock.cpp
@@ -38,7 +38,7 @@
 
 void HostLock::Unlock() {
   Sides sides_to_signal = UnlockCommon(gettid());
-  if (sides_to_signal.value_ != Sides::NoSides) {
+  if (sides_to_signal != Sides::NoSides) {
     SingleSidedSignal::Signal(&lock_uint32_);
   }
 }
diff --git a/host/vsoc/lib/host_region_e2e_test.cpp b/host/vsoc/lib/host_region_e2e_test.cpp
index 13f453b..0be719f 100644
--- a/host/vsoc/lib/host_region_e2e_test.cpp
+++ b/host/vsoc/lib/host_region_e2e_test.cpp
@@ -83,9 +83,8 @@
   // Test signals
   EXPECT_FALSE(secondary->HasIncomingInterrupt());
   LOG(INFO) << "Verified no early second signal";
-  vsoc::layout::Sides side;
-  side.value_ = vsoc::layout::Sides::Peer;
-  primary->SendSignal(side, &primary->data()->host_to_guest_signal);
+  primary->SendSignal(vsoc::layout::Sides::Peer,
+                      &primary->data()->host_to_guest_signal);
   LOG(INFO) << "Signal sent. Waiting for first signal from peer";
   primary->WaitForInterrupt();
   int count = 0;  // counts the number of signals received.
@@ -96,7 +95,8 @@
       });
   EXPECT_TRUE(count == 1);
   LOG(INFO) << "Signal received on primary region";
-  secondary->SendSignal(side, &secondary->data()->host_to_guest_signal);
+  secondary->SendSignal(vsoc::layout::Sides::Peer,
+                        &secondary->data()->host_to_guest_signal);
   LOG(INFO) << "Signal sent. Waiting for second signal from peer";
   secondary->WaitForInterrupt();
   count = 0;