diff options
Diffstat (limited to 'chromium/device/bluetooth/bluetooth_socket_thread.cc')
-rw-r--r-- | chromium/device/bluetooth/bluetooth_socket_thread.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/chromium/device/bluetooth/bluetooth_socket_thread.cc b/chromium/device/bluetooth/bluetooth_socket_thread.cc new file mode 100644 index 00000000000..1f3b97bf98b --- /dev/null +++ b/chromium/device/bluetooth/bluetooth_socket_thread.cc @@ -0,0 +1,78 @@ +// 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<scoped_refptr<BluetoothSocketThread> > g_instance = + LAZY_INSTANCE_INITIALIZER; + +// static +scoped_refptr<BluetoothSocketThread> BluetoothSocketThread::Get() { + if (!g_instance.Get().get()) { + g_instance.Get() = new BluetoothSocketThread(); + } + return g_instance.Get(); +} + +// static +void BluetoothSocketThread::CleanupForTesting() { + DCHECK(g_instance.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_--; + if (active_socket_count_ == 0 && thread_) { + thread_->Stop(); + thread_.reset(NULL); + task_runner_ = NULL; + } +} + +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_->message_loop_proxy(); +} + +scoped_refptr<base::SequencedTaskRunner> BluetoothSocketThread::task_runner() + const { + DCHECK(active_socket_count_ > 0); + DCHECK(thread_); + DCHECK(task_runner_); + + return task_runner_; +} + +} // namespace device |