blob: c9fbb8adfb5bdba7caeddfc70cf3cda931181150 [file] [log] [blame]
// 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/message_loop/message_loop.h"
#include "base/sequenced_task_runner.h"
#include "base/threading/thread.h"
namespace device {
base::LazyInstance<scoped_refptr<BluetoothSocketThread>>::DestructorAtExit
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().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<base::SequencedTaskRunner> BluetoothSocketThread::task_runner()
const {
DCHECK(active_socket_count_ > 0);
DCHECK(thread_);
DCHECK(task_runner_.get());
return task_runner_;
}
} // namespace device