// 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();
}

BluetoothSocketThread::BluetoothSocketThread()
    : active_socket_count_(0) {}

BluetoothSocketThread::~BluetoothSocketThread() {}

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
