// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "device/bluetooth/bluetooth_socket_thread.h" #include "base/lazy_instance.h" #include "base/sequenced_task_runner.h" #include "base/threading/thread.h" namespace device { base::LazyInstance > g_instance = LAZY_INSTANCE_INITIALIZER; // static scoped_refptr BluetoothSocketThread::Get() { if (!g_instance.Get().get()) { g_instance.Get() = new BluetoothSocketThread(); } return g_instance.Get(); } // static void BluetoothSocketThread::CleanupForTesting() { DCHECK(g_instance.Get().get()); g_instance.Get() = NULL; } BluetoothSocketThread::BluetoothSocketThread() : active_socket_count_(0) {} BluetoothSocketThread::~BluetoothSocketThread() { if (thread_) { thread_->Stop(); thread_.reset(NULL); task_runner_ = NULL; } } void BluetoothSocketThread::OnSocketActivate() { DCHECK(thread_checker_.CalledOnValidThread()); active_socket_count_++; EnsureStarted(); } void BluetoothSocketThread::OnSocketDeactivate() { DCHECK(thread_checker_.CalledOnValidThread()); active_socket_count_--; } void BluetoothSocketThread::EnsureStarted() { DCHECK(thread_checker_.CalledOnValidThread()); if (thread_) return; base::Thread::Options thread_options; thread_options.message_loop_type = base::MessageLoop::TYPE_IO; thread_.reset(new base::Thread("BluetoothSocketThread")); thread_->StartWithOptions(thread_options); task_runner_ = thread_->task_runner(); } scoped_refptr BluetoothSocketThread::task_runner() const { DCHECK(active_socket_count_ > 0); DCHECK(thread_); DCHECK(task_runner_.get()); return task_runner_; } } // namespace device