16f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie/* 26f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * Copyright (C) 2017 The Android Open Source Project 36f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * 46f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * Licensed under the Apache License, Version 2.0 (the "License"); 56f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * you may not use this file except in compliance with the License. 66f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * You may obtain a copy of the License at 76f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * 86f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * http://www.apache.org/licenses/LICENSE-2.0 96f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * 106f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * Unless required by applicable law or agreed to in writing, software 116f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * distributed under the License is distributed on an "AS IS" BASIS, 126f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * See the License for the specific language governing permissions and 146f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie * limitations under the License. 156f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie */ 166f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie 176f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie#include "chre/platform/slpi/preloaded_nanoapps.h" 186f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie 191e1b4540dce4d12fee5b95f5afa8efc409c01736Andrew Rossignol#include "chre/core/event_loop_manager.h" 206f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie#include "chre/platform/fatal_error.h" 216f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie#include "chre/util/macros.h" 226f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie 236f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddienamespace chre { 246f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie 250db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol// The CHRE build variant can supply this macro to override the detault list of 260db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol// preloaded nanoapps. This list is supplied empty to ensure that the symbol is 270db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol// available for platforms with no preloaded nanoapps. 280db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol#ifndef CHRE_VARIANT_SUPPLIES_PRELOADED_NANOAPP_LIST 290db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol 300db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol//! The default list of preloaded nanoapps to load. 310db49452d6e291726c6d70bdd36d48a9f16adba9Andrew RossignolPreloadedNanoappDescriptor kPreloadedNanoappList[] = {}; 320db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol 330db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol//! The size of the default preloaded nanoapp list. 340db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignolconst size_t kPreloadedNanoappCount = ARRAY_SIZE(kPreloadedNanoappList); 350db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol 360db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol#endif // CHRE_VARIANT_SUPPLIES_PRELOADED_NANOAPP_LIST 370db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol 381e1b4540dce4d12fee5b95f5afa8efc409c01736Andrew Rossignolvoid loadPreloadedNanoapps() { 390db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol // Compare with zero to allow the compiler to optimize away the loop. 400db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol // Tautological comparisons are not warnings when comparing a const with 410db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol // another const. 420db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol if (kPreloadedNanoappCount > 0) { 430db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol // Cast the kPreloadedNanoappCount to size_t to avoid tautological comparison 440db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol // warnings when the kStaticNanoappCount is zero. 450db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol EventLoop& eventLoop = EventLoopManagerSingleton::get()->getEventLoop(); 460db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol size_t nanoappCount = reinterpret_cast<size_t>(kPreloadedNanoappCount); 470db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol for (size_t i = 0; i < nanoappCount; i++) { 480db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol auto& app = kPreloadedNanoappList[i]; 490db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol if (app.nanoapp.isNull()) { 500db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol FATAL_ERROR("Couldn't allocate memory for preloaded nanoapp"); 510db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol } else { 520db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol app.nanoapp->loadFromFile(app.appId, app.filename); 530db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol eventLoop.startNanoapp(app.nanoapp); 540db49452d6e291726c6d70bdd36d48a9f16adba9Andrew Rossignol } 556f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie } 566f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie } 576f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie} 586f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie 596f7ee70aab8a27c9c6ec431dc12b71a2b2bb9babBrian Duddie} // namespace chre 60