1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "device/bluetooth/bluetooth_socket_thread.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/lazy_instance.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/sequenced_task_runner.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/threading/thread.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace device { 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::LazyInstance<scoped_refptr<BluetoothSocketThread> > g_instance = 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LAZY_INSTANCE_INITIALIZER; 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// static 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_refptr<BluetoothSocketThread> BluetoothSocketThread::Get() { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!g_instance.Get().get()) { 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) g_instance.Get() = new BluetoothSocketThread(); 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return g_instance.Get(); 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BluetoothSocketThread::CleanupForTesting() { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(g_instance.Get().get()); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_instance.Get() = NULL; 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)BluetoothSocketThread::BluetoothSocketThread() 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : active_socket_count_(0) {} 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BluetoothSocketThread::~BluetoothSocketThread() { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (thread_) { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thread_->Stop(); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thread_.reset(NULL); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) task_runner_ = NULL; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BluetoothSocketThread::OnSocketActivate() { 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch active_socket_count_++; 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnsureStarted(); 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BluetoothSocketThread::OnSocketDeactivate() { 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch active_socket_count_--; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (active_socket_count_ == 0 && thread_) { 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch thread_->Stop(); 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch thread_.reset(NULL); 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch task_runner_ = NULL; 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BluetoothSocketThread::EnsureStarted() { 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(thread_checker_.CalledOnValidThread()); 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (thread_) 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Thread::Options thread_options; 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch thread_options.message_loop_type = base::MessageLoop::TYPE_IO; 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) thread_.reset(new base::Thread("BluetoothSocketThread")); 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch thread_->StartWithOptions(thread_options); 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch task_runner_ = thread_->message_loop_proxy(); 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)scoped_refptr<base::SequencedTaskRunner> BluetoothSocketThread::task_runner() 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const { 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(active_socket_count_ > 0); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(thread_); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(task_runner_.get()); 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return task_runner_; 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace device 79