init.cc revision f53ddfb0683e210f9cf803d968c2d8c5d3b00a55
1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/*
2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project
3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License.
6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at
7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software
11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and
14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License.
15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event.h"
18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event_loop.h"
19b1c45b9446bd6bf2e95b0768353165e8009594f6Andrew Rossignol#include "chre/core/event_loop_manager.h"
20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/init.h"
21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/nanoapp.h"
22f53ddfb0683e210f9cf803d968c2d8c5d3b00a55Andrew Rossignol#include "chre/core/static_nanoapps.h"
23388d81b80425f66acb306c774e46d53221d36b33Andrew Rossignol#include "chre/platform/context.h"
24e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/platform/log.h"
252003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol#include "chre/platform/shared/platform_log.h"
26e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/platform/system_timer.h"
27e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/util/time.h"
28e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
29e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include <csignal>
30cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie#include <thread>
31e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
32e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieusing chre::Milliseconds;
33e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
34e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddienamespace {
35e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
36e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieextern "C" void signalHandler(int sig) {
37e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  (void) sig;
38e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  LOGI("Stop request received");
39388d81b80425f66acb306c774e46d53221d36b33Andrew Rossignol  chre::getCurrentEventLoop()->stop();
40e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}
41e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
42e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}
43e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
44e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieint main() {
452003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol  chre::PlatformLogSingleton::init();
46e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  chre::init();
47e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
48e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol  // Construct the event loop and register the signal handler.
492de17c9c5c541d72248f8371dfb4d7e402dc93e8Andrew Rossignol  chre::EventLoop& eventLoop = *chre::getCurrentEventLoop();
50ece2a2d31bf96888182e2b37165bafb499bbdd58Andrew Rossignol  std::signal(SIGINT, signalHandler);
51e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol
52e969b9be8eca27ffc875167879ab0ec093b3e313Andrew Rossignol  // Load any static nanoapps and start the event loop.
53cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie  std::thread chreThread([&]() {
54cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie    chre::loadStaticNanoapps(&eventLoop);
55cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie    eventLoop.run();
56cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie  });
57cc39d7566ed61c7127020228e1439a49e07074f9Brian Duddie  chreThread.join();
58e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
59b5ef2cebc2d8b17e1dd4fa026d3842f97c79d8fbAndrew Rossignol  chre::deinit();
602003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol  chre::PlatformLogSingleton::deinit();
61e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  return 0;
62e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}
63