1// Copyright 2013 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 "content/utility/in_process_utility_thread.h"
6
7#include "content/child/child_process.h"
8#include "content/utility/utility_thread_impl.h"
9
10namespace content {
11
12// We want to ensure there's only one utility thread running at a time, as there
13// are many globals used in the utility process.
14static base::LazyInstance<base::Lock> g_one_utility_thread_lock;
15
16InProcessUtilityThread::InProcessUtilityThread(const std::string& channel_id)
17    : Thread("Chrome_InProcUtilityThread"), channel_id_(channel_id) {
18}
19
20InProcessUtilityThread::~InProcessUtilityThread() {
21  Stop();
22}
23
24void InProcessUtilityThread::Init() {
25  // We need to return right away or else the main thread that started us will
26  // hang.
27  base::MessageLoop::current()->PostTask(
28      FROM_HERE,
29      base::Bind(&InProcessUtilityThread::InitInternal,
30                 base::Unretained(this)));
31}
32
33void InProcessUtilityThread::CleanUp() {
34  child_process_.reset();
35
36  // See comment in RendererMainThread.
37  SetThreadWasQuitProperly(true);
38  g_one_utility_thread_lock.Get().Release();
39}
40
41void InProcessUtilityThread::InitInternal() {
42  g_one_utility_thread_lock.Get().Acquire();
43  child_process_.reset(new ChildProcess());
44  child_process_->set_main_thread(new UtilityThreadImpl(channel_id_));
45}
46
47base::Thread* CreateInProcessUtilityThread(const std::string& channel_id) {
48  return new InProcessUtilityThread(channel_id);
49}
50
51}  // namespace content
52