1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/public/cpp/environment/environment.h"
6
7#include <assert.h>
8#include <stddef.h>
9
10#include "mojo/public/c/environment/logger.h"
11#include "mojo/public/cpp/environment/lib/default_async_waiter.h"
12#include "mojo/public/cpp/environment/lib/default_logger.h"
13#include "mojo/public/cpp/utility/run_loop.h"
14
15namespace mojo {
16
17namespace {
18
19const MojoAsyncWaiter* g_default_async_waiter = NULL;
20const MojoLogger* g_default_logger = NULL;
21
22void Init(const MojoAsyncWaiter* default_async_waiter,
23          const MojoLogger* default_logger) {
24  g_default_async_waiter =
25      default_async_waiter ? default_async_waiter :
26                             &internal::kDefaultAsyncWaiter;
27  g_default_logger = default_logger ? default_logger :
28                                      &internal::kDefaultLogger;
29
30  RunLoop::SetUp();
31}
32
33}  // namespace
34
35Environment::Environment() {
36  Init(NULL, NULL);
37}
38
39Environment::Environment(const MojoAsyncWaiter* default_async_waiter,
40                         const MojoLogger* default_logger) {
41  Init(default_async_waiter, default_logger);
42}
43
44Environment::~Environment() {
45  RunLoop::TearDown();
46
47  // TODO(vtl): Maybe we should allow nesting, and restore previous default
48  // async waiters and loggers?
49  g_default_async_waiter = NULL;
50  g_default_logger = NULL;
51}
52
53// static
54const MojoAsyncWaiter* Environment::GetDefaultAsyncWaiter() {
55  assert(g_default_async_waiter);  // Fails if not "inside" |Environment|.
56  return g_default_async_waiter;
57}
58
59// static
60const MojoLogger* Environment::GetDefaultLogger() {
61  assert(g_default_logger);  // Fails if not "inside" |Environment|.
62  return g_default_logger;
63}
64
65}  // namespace mojo
66