1171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju/* 2171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Copyright (C) 2017 The Android Open Source Project 3171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * 4171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Licensed under the Apache License, Version 2.0 (the "License"); 5171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * you may not use this file except in compliance with the License. 6171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * You may obtain a copy of the License at 7171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * 8171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * http://www.apache.org/licenses/LICENSE-2.0 9171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * 10171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * Unless required by applicable law or agreed to in writing, software 11171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * distributed under the License is distributed on an "AS IS" BASIS, 12171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * See the License for the specific language governing permissions and 14171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju * limitations under the License. 15171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju */ 16171603eaa9bbb2b8189f5231338bcd928fde7383Hridya Valsaraju 178a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju#include "TestMsgQ.h" 188a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 198a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace android { 208a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace hardware { 218a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace tests { 228a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace msgq { 238a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace V1_0 { 248a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsarajunamespace implementation { 258a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 268a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju// Methods from ::android::hardware::tests::msgq::V1_0::ITestMsgQ follow. 278a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::configureFmqSyncReadWrite(configureFmqSyncReadWrite_cb _hidl_cb) { 288a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static constexpr size_t kNumElementsInQueue = 1024; 298a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju mFmqSynchronized.reset(new (std::nothrow) MessageQueueSync( 308a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju kNumElementsInQueue, true /* configureEventFlagWord */)); 318a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if ((mFmqSynchronized == nullptr) || (mFmqSynchronized->isValid() == false)) { 328a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju _hidl_cb(false /* ret */, MessageQueueSync::Descriptor()); 338a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } else { 348a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju /* 358a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju * Initialize the EventFlag word with bit FMQ_NOT_FULL. 368a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju */ 378a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju auto evFlagWordPtr = mFmqSynchronized->getEventFlagWord(); 388a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if (evFlagWordPtr != nullptr) { 398a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::atomic_init(evFlagWordPtr, 408a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL)); 418a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 428a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju _hidl_cb(true /* ret */, *mFmqSynchronized->getDesc()); 438a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 448a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return Void(); 458a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 468a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 478a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::getFmqUnsyncWrite(bool configureFmq, getFmqUnsyncWrite_cb _hidl_cb) { 488a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if (configureFmq) { 498a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static constexpr size_t kNumElementsInQueue = 1024; 508a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju mFmqUnsynchronized.reset(new (std::nothrow) MessageQueueUnsync(kNumElementsInQueue)); 518a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 528a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if ((mFmqUnsynchronized == nullptr) || 538a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju (mFmqUnsynchronized->isValid() == false)) { 548a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju _hidl_cb(false /* ret */, MessageQueueUnsync::Descriptor()); 558a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } else { 568a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju _hidl_cb(true /* ret */, *mFmqUnsynchronized->getDesc()); 578a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 588a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return Void(); 598a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 608a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 618a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestWriteFmqSync(int32_t count) { 628a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 638a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju for (int i = 0; i < count; i++) { 648a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju data[i] = i; 658a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 668a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqSynchronized->write(&data[0], count); 678a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return result; 688a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 698a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 708a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestReadFmqSync(int32_t count) { 718a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 728a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqSynchronized->read(&data[0], count) 738a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju && verifyData(&data[0], count); 748a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return result; 758a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 768a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 778a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestWriteFmqUnsync(int32_t count) { 788a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 798a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju for (int i = 0; i < count; i++) { 808a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju data[i] = i; 818a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 828a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqUnsynchronized->write(&data[0], count); 838a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return result; 848a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 858a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 868a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<bool> TestMsgQ::requestReadFmqUnsync(int32_t count) { 878a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 888a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = 898a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju mFmqUnsynchronized->read(&data[0], count) && verifyData(&data[0], count); 908a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return result; 918a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 928a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 938a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingRead(int32_t count) { 948a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 958a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqSynchronized->readBlocking( 968a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju &data[0], 978a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju count, 988a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL), 998a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY), 1008a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 5000000000 /* timeOutNanos */); 1018a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1028a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if (result == false) { 1038a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju ALOGE("Blocking read fails"); 1048a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 1058a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return Void(); 1068a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 1078a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1088a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingReadDefaultEventFlagBits(int32_t count) { 1098a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 1108a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqSynchronized->readBlocking( 1118a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju &data[0], 1128a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju count); 1138a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1148a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if (result == false) { 1158a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju ALOGE("Blocking read fails"); 1168a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 1178a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1188a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return Void(); 1198a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 1208a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1218a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuReturn<void> TestMsgQ::requestBlockingReadRepeat(int32_t count, int32_t numIter) { 1228a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju std::vector<uint16_t> data(count); 1238a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju for (int i = 0; i < numIter; i++) { 1248a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju bool result = mFmqSynchronized->readBlocking( 1258a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju &data[0], 1268a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju count, 1278a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_FULL), 1288a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju static_cast<uint32_t>(ITestMsgQ::EventFlagBits::FMQ_NOT_EMPTY), 1298a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 5000000000 /* timeOutNanos */); 1308a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1318a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju if (result == false) { 1328a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju ALOGE("Blocking read fails"); 1338a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju break; 1348a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 1358a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju } 1368a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return Void(); 1378a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 1388a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1398a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1408a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju// Methods from ::android::hidl::base::V1_0::IBase follow. 1418a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1428a7086296c145494ca35f93cd9c4f45a1c646689Hridya ValsarajuITestMsgQ* HIDL_FETCH_ITestMsgQ(const char* /* name */) { 1438a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju return new TestMsgQ(); 1448a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} 1458a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju 1468a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace implementation 1478a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace V1_0 1488a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace msgq 1498a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace tests 1508a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace hardware 1518a7086296c145494ca35f93cd9c4f45a1c646689Hridya Valsaraju} // namespace android 152