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