1b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol/* 2b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * Copyright (C) 2016 The Android Open Source Project 3b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * 4b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 5b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * you may not use this file except in compliance with the License. 6b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * You may obtain a copy of the License at 7b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * 8b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 9b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * 10b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * Unless required by applicable law or agreed to in writing, software 11b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 12b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * See the License for the specific language governing permissions and 14b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol * limitations under the License. 15b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol */ 16b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol 17b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol#include "chre/core/event_loop_manager.h" 18b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol 19341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie#include "chre/platform/fatal_error.h" 204d4114f774c181bf46cf57f36f68cc0674dd347cBrian Duddie#include "chre/platform/memory.h" 2138a73f3037b8047e50eda40e0584c90c50078191Andrew Rossignol#include "chre/util/lock_guard.h" 2238a73f3037b8047e50eda40e0584c90c50078191Andrew Rossignol 23b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignolnamespace chre { 24b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol 254d4114f774c181bf46cf57f36f68cc0674dd347cBrian Duddievoid freeEventDataCallback(uint16_t /*eventType*/, void *eventData) { 264d4114f774c181bf46cf57f36f68cc0674dd347cBrian Duddie memoryFree(eventData); 274d4114f774c181bf46cf57f36f68cc0674dd347cBrian Duddie} 284d4114f774c181bf46cf57f36f68cc0674dd347cBrian Duddie 2950d7d95f1d8cae0e9c6202086b9bd432adff7bf1Andrew RossignolNanoapp *EventLoopManager::validateChreApiCall(const char *functionName) { 3050d7d95f1d8cae0e9c6202086b9bd432adff7bf1Andrew Rossignol chre::Nanoapp *currentNanoapp = EventLoopManagerSingleton::get() 3150d7d95f1d8cae0e9c6202086b9bd432adff7bf1Andrew Rossignol ->getEventLoop().getCurrentNanoapp(); 3250d7d95f1d8cae0e9c6202086b9bd432adff7bf1Andrew Rossignol CHRE_ASSERT_LOG(currentNanoapp, "%s called with no CHRE app context", 3350d7d95f1d8cae0e9c6202086b9bd432adff7bf1Andrew Rossignol functionName); 34841e366daaacd7a893046add8535c9a23d9bc599Andrew Rossignol return currentNanoapp; 35841e366daaacd7a893046add8535c9a23d9bc599Andrew Rossignol} 36841e366daaacd7a893046add8535c9a23d9bc599Andrew Rossignol 3758276308709e5568ba2976e93b37211a52589166Brian DuddieUniquePtr<char> EventLoopManager::debugDump() { 387e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro constexpr size_t kDebugStringSize = 4096; 3958276308709e5568ba2976e93b37211a52589166Brian Duddie char *debugStr = static_cast<char *>(memoryAlloc(kDebugStringSize)); 4058276308709e5568ba2976e93b37211a52589166Brian Duddie if (debugStr != nullptr) { 41d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro size_t debugStrPos = 0; 42d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro if (!mMemoryManager.logStateToBuffer(debugStr, &debugStrPos, 43d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro kDebugStringSize)) { 44d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro LOGE("Memory manager debug dump failed."); 45d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro } else if (!mEventLoop.logStateToBuffer(debugStr, &debugStrPos, 46d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro kDebugStringSize)) { 47d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro LOGE("Event loop debug dump failed."); 48d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro } else if (!mSensorRequestManager.logStateToBuffer(debugStr, &debugStrPos, 49d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro kDebugStringSize)) { 50d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro LOGE("Sensor request manager debug dump failed."); 5110d594714109f837bd5bfe819977eb357b5dbf83Meng-hsuan Chung } else if (!mGnssManager.logStateToBuffer(debugStr, &debugStrPos, 5210d594714109f837bd5bfe819977eb357b5dbf83Meng-hsuan Chung kDebugStringSize)) { 5310d594714109f837bd5bfe819977eb357b5dbf83Meng-hsuan Chung LOGE("GNSS manager debug dump failed."); 547e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro } else if (!mWifiRequestManager.logStateToBuffer(debugStr, &debugStrPos, 557e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro kDebugStringSize)) { 567e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro LOGE("Wifi request manager debug dump failed."); 577e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro } else if (!mWwanRequestManager.logStateToBuffer(debugStr, &debugStrPos, 587e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro kDebugStringSize)) { 597e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro LOGE("WWAN request manager debug dump failed."); 60d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro } 617e76ba4dbeea9ea33132bf31b7c3887284c4bd87Arthur Ishiguro LOGD("Debug dump used %zu bytes of log buffer", debugStrPos); 6258276308709e5568ba2976e93b37211a52589166Brian Duddie } 6358276308709e5568ba2976e93b37211a52589166Brian Duddie 6458276308709e5568ba2976e93b37211a52589166Brian Duddie return UniquePtr<char>(debugStr); 6558276308709e5568ba2976e93b37211a52589166Brian Duddie} 6658276308709e5568ba2976e93b37211a52589166Brian Duddie 67341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddieuint32_t EventLoopManager::getNextInstanceId() { 68341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie ++mLastInstanceId; 69341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie 70341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie // ~4 billion instance IDs should be enough for anyone... if we need to 71341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie // support wraparound for stress testing load/unload, then we can set a flag 72341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie // when wraparound occurs and use EventLoop::findNanoappByInstanceId to ensure 73341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie // we avoid conflicts 74341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie if (mLastInstanceId == kBroadcastInstanceId 75341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie || mLastInstanceId == kSystemInstanceId) { 76341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie FATAL_ERROR("Exhausted instance IDs!"); 77341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie } 78341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie 79341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie return mLastInstanceId; 80341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie} 81341292509cfde0f859d89bda4ca5d55fc9772e64Brian Duddie 822ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddievoid EventLoopManager::lateInit() { 8310d594714109f837bd5bfe819977eb357b5dbf83Meng-hsuan Chung mGnssManager.init(); 842ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie mWifiRequestManager.init(); 852ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie mWwanRequestManager.init(); 86bde6346f67daac7281880733a015a1b4bd6ace52Andrew Rossignol 87bde6346f67daac7281880733a015a1b4bd6ace52Andrew Rossignol#ifdef CHRE_AUDIO_SUPPORT_ENABLED 88bde6346f67daac7281880733a015a1b4bd6ace52Andrew Rossignol mAudioRequestManager.init(); 89bde6346f67daac7281880733a015a1b4bd6ace52Andrew Rossignol#endif // CHRE_AUDIO_SUPPORT_ENABLED 902ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie} 912ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie 9281884578e33f71f81fe0a288fc416fcf792e9b0fAndrew Rossignol// Explicitly instantiate the EventLoopManagerSingleton to reduce codesize. 9381884578e33f71f81fe0a288fc416fcf792e9b0fAndrew Rossignoltemplate class Singleton<EventLoopManager>; 9481884578e33f71f81fe0a288fc416fcf792e9b0fAndrew Rossignol 95b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol} // namespace chre 96