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