普通文本  |  96行  |  3.49 KB

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "chre/core/event_loop_manager.h"

#include "chre/platform/fatal_error.h"
#include "chre/platform/memory.h"
#include "chre/util/lock_guard.h"

namespace chre {

void freeEventDataCallback(uint16_t /*eventType*/, void *eventData) {
  memoryFree(eventData);
}

Nanoapp *EventLoopManager::validateChreApiCall(const char *functionName) {
  chre::Nanoapp *currentNanoapp = EventLoopManagerSingleton::get()
      ->getEventLoop().getCurrentNanoapp();
  CHRE_ASSERT_LOG(currentNanoapp, "%s called with no CHRE app context",
                  functionName);
  return currentNanoapp;
}

UniquePtr<char> EventLoopManager::debugDump() {
  constexpr size_t kDebugStringSize = 4096;
  char *debugStr = static_cast<char *>(memoryAlloc(kDebugStringSize));
  if (debugStr != nullptr) {
    size_t debugStrPos = 0;
    if (!mMemoryManager.logStateToBuffer(debugStr, &debugStrPos,
                                         kDebugStringSize)) {
      LOGE("Memory manager debug dump failed.");
    } else if (!mEventLoop.logStateToBuffer(debugStr, &debugStrPos,
                                            kDebugStringSize)) {
      LOGE("Event loop debug dump failed.");
    } else if (!mSensorRequestManager.logStateToBuffer(debugStr, &debugStrPos,
                                                       kDebugStringSize)) {
      LOGE("Sensor request manager debug dump failed.");
    } else if (!mGnssManager.logStateToBuffer(debugStr, &debugStrPos,
                                              kDebugStringSize)) {
      LOGE("GNSS manager debug dump failed.");
    } else if (!mWifiRequestManager.logStateToBuffer(debugStr, &debugStrPos,
                                                     kDebugStringSize)) {
      LOGE("Wifi request manager debug dump failed.");
    } else if (!mWwanRequestManager.logStateToBuffer(debugStr, &debugStrPos,
                                                     kDebugStringSize)) {
      LOGE("WWAN request manager debug dump failed.");
    }
    LOGD("Debug dump used %zu bytes of log buffer", debugStrPos);
  }

  return UniquePtr<char>(debugStr);
}

uint32_t EventLoopManager::getNextInstanceId() {
  ++mLastInstanceId;

  // ~4 billion instance IDs should be enough for anyone... if we need to
  // support wraparound for stress testing load/unload, then we can set a flag
  // when wraparound occurs and use EventLoop::findNanoappByInstanceId to ensure
  // we avoid conflicts
  if (mLastInstanceId == kBroadcastInstanceId
      || mLastInstanceId == kSystemInstanceId) {
    FATAL_ERROR("Exhausted instance IDs!");
  }

  return mLastInstanceId;
}

void EventLoopManager::lateInit() {
  mGnssManager.init();
  mWifiRequestManager.init();
  mWwanRequestManager.init();

#ifdef CHRE_AUDIO_SUPPORT_ENABLED
  mAudioRequestManager.init();
#endif  // CHRE_AUDIO_SUPPORT_ENABLED
}

// Explicitly instantiate the EventLoopManagerSingleton to reduce codesize.
template class Singleton<EventLoopManager>;

}  // namespace chre