[starnix] Fix fmq unit tests on Fuchsia
Update the unit tests so that futex are registered and can be used with
a LutexController
Change-Id: I8040e94109e86fb08d82a347999d3f8452a8e02c
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/android.googlesource.com/platform/system/libfmq/+/917433
Reviewed-by: Adam Barth <abarth@google.com>
diff --git a/tests/fmq_unit_tests.cpp b/tests/fmq_unit_tests.cpp
index 7cd0d33..33972b8 100644
--- a/tests/fmq_unit_tests.cpp
+++ b/tests/fmq_unit_tests.cpp
@@ -27,6 +27,10 @@
#include <sstream>
#include <thread>
+#if defined(__Fuchsia__)
+#include "vendor/google/starnix/android/remote_binder/lutex.h"
+#endif
+
using aidl::android::hardware::common::fmq::SynchronizedReadWrite;
using aidl::android::hardware::common::fmq::UnsynchronizedWrite;
using android::hardware::kSynchronizedReadWrite;
@@ -155,6 +159,39 @@
TYPED_TEST_CASE(BlockingReadWrites, SyncTypes);
+class RegisteredFutex {
+ public:
+#if defined(__Fuchsia__)
+ RegisteredFutex() {
+ android::base::unique_fd fd(::ashmem_create_region(
+ "RegisteredFutex", PAGE_SIZE));
+ mapping = mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd.get(), 0);
+ if (mapping != MAP_FAILED) {
+ starnix::register_lutex(fd.get(), 0, mapping);
+ }
+ }
+
+ ~RegisteredFutex() {
+ starnix::unregister_lutex(mapping);
+ munmap(mapping, PAGE_SIZE);
+ }
+#else
+ RegisteredFutex() {
+ mapping = &value;
+ }
+#endif
+
+ std::atomic<uint32_t>* GetAtomic() {
+ return static_cast<std::atomic<uint32_t>*>(mapping);
+ }
+
+ private:
+#if !defined(__Fuchsia__)
+ std::atomic<uint32_t> value;
+#endif
+ void* mapping = nullptr;
+};
+
template <typename T>
class BlockingReadWrites : public TestBase<T> {
protected:
@@ -177,14 +214,16 @@
ASSERT_TRUE(mQueue->isValid());
mNumMessagesMax = mQueue->getQuantumCount();
ASSERT_EQ(kNumElementsInQueue, mNumMessagesMax);
+ mFw = mRegisteredFutex.GetAtomic();
/*
* Initialize the EventFlag word to indicate Queue is not full.
*/
- std::atomic_init(&mFw, static_cast<uint32_t>(kFmqNotFull));
+ std::atomic_init(mFw, static_cast<uint32_t>(kFmqNotFull));
}
typename T::MQType* mQueue;
- std::atomic<uint32_t> mFw;
+ RegisteredFutex mRegisteredFutex;
+ std::atomic<uint32_t>* mFw;
size_t mNumMessagesMax = 0;
};
@@ -610,7 +649,7 @@
uint8_t data[dataLen] = {0};
android::hardware::EventFlag* efGroup = nullptr;
- android::status_t status = android::hardware::EventFlag::createEventFlag(&this->mFw, &efGroup);
+ android::status_t status = android::hardware::EventFlag::createEventFlag(this->mFw, &efGroup);
ASSERT_EQ(android::NO_ERROR, status);
ASSERT_NE(nullptr, efGroup);
@@ -619,7 +658,7 @@
* Start a thread that will try to read and block on kFmqNotEmpty.
*/
std::thread Reader(BlockingReadWrites<TypeParam>::ReaderThreadBlocking, this->mQueue,
- &this->mFw);
+ this->mFw);
struct timespec waitTime = {0, 100 * 1000000};
ASSERT_EQ(0, nanosleep(&waitTime, NULL));
@@ -647,7 +686,7 @@
uint8_t data[dataLen] = {0};
android::hardware::EventFlag* efGroup = nullptr;
- android::status_t status = android::hardware::EventFlag::createEventFlag(&this->mFw, &efGroup);
+ android::status_t status = android::hardware::EventFlag::createEventFlag(this->mFw, &efGroup);
ASSERT_EQ(android::NO_ERROR, status);
ASSERT_NE(nullptr, efGroup);
@@ -657,7 +696,7 @@
* call wake() on kFmqNotFull when the read is successful.
*/
std::thread Reader(BlockingReadWrites<TypeParam>::ReaderThreadBlocking2, this->mQueue,
- &this->mFw);
+ this->mFw);
bool ret = this->mQueue->writeBlocking(data, dataLen, static_cast<uint32_t>(kFmqNotFull),
static_cast<uint32_t>(kFmqNotEmpty),
5000000000 /* timeOutNanos */, efGroup);
@@ -673,7 +712,7 @@
*/
TYPED_TEST(BlockingReadWrites, BlockingTimeOutTest) {
android::hardware::EventFlag* efGroup = nullptr;
- android::status_t status = android::hardware::EventFlag::createEventFlag(&this->mFw, &efGroup);
+ android::status_t status = android::hardware::EventFlag::createEventFlag(this->mFw, &efGroup);
ASSERT_EQ(android::NO_ERROR, status);
ASSERT_NE(nullptr, efGroup);