15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/environment/environment.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <assert.h>
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <stddef.h>
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "mojo/public/c/environment/logger.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "mojo/public/cpp/environment/lib/default_async_waiter.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "mojo/public/cpp/environment/lib/default_logger.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/utility/run_loop.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace mojo {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const MojoAsyncWaiter* g_default_async_waiter = NULL;
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const MojoLogger* g_default_logger = NULL;
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Init(const MojoAsyncWaiter* default_async_waiter,
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          const MojoLogger* default_logger) {
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  g_default_async_waiter =
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      default_async_waiter ? default_async_waiter :
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                             &internal::kDefaultAsyncWaiter;
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  g_default_logger = default_logger ? default_logger :
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                      &internal::kDefaultLogger;
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunLoop::SetUp();
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)Environment::Environment() {
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Init(NULL, NULL);
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)Environment::Environment(const MojoAsyncWaiter* default_async_waiter,
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                         const MojoLogger* default_logger) {
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Init(default_async_waiter, default_logger);
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Environment::~Environment() {
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunLoop::TearDown();
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // TODO(vtl): Maybe we should allow nesting, and restore previous default
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // async waiters and loggers?
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  g_default_async_waiter = NULL;
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  g_default_logger = NULL;
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// static
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const MojoAsyncWaiter* Environment::GetDefaultAsyncWaiter() {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  assert(g_default_async_waiter);  // Fails if not "inside" |Environment|.
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return g_default_async_waiter;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const MojoLogger* Environment::GetDefaultLogger() {
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  assert(g_default_logger);  // Fails if not "inside" |Environment|.
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return g_default_logger;
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace mojo
66