1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Use of this source code is governed by a BSD-style license that can be
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// found in the LICENSE file.
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "content/public/utility/utility_thread.h"
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/lazy_instance.h"
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "base/threading/thread_local.h"
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnamespace content {
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Keep the global UtilityThread in a TLS slot so it is impossible to access
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// incorrectly from the wrong thread.
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic base::LazyInstance<base::ThreadLocalPointer<UtilityThread> >::Leaky
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    lazy_tls = LAZY_INSTANCE_INITIALIZER;
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUtilityThread* UtilityThread::Get() {
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return lazy_tls.Pointer()->Get();
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUtilityThread::UtilityThread() {
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  lazy_tls.Pointer()->Set(this);
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUtilityThread::~UtilityThread() {
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  lazy_tls.Pointer()->Set(NULL);
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}  // namespace content
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov