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;