1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_THREAD_H_
6#define DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_THREAD_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/threading/thread_checker.h"
11
12namespace base {
13class SequencedTaskRunner;
14class Thread;
15}  // namespace base
16
17namespace device {
18
19// Thread abstraction used by |BluetoothSocketChromeOS| and |BluetoothSocketWin|
20// to perform IO operations on the underlying platform sockets. An instance of
21// this class can be shared by many active sockets.
22class BluetoothSocketThread
23    : public base::RefCountedThreadSafe<BluetoothSocketThread> {
24 public:
25  static scoped_refptr<BluetoothSocketThread> Get();
26  static void CleanupForTesting();
27
28  void OnSocketActivate();
29  void OnSocketDeactivate();
30
31  scoped_refptr<base::SequencedTaskRunner> task_runner() const;
32
33 private:
34  friend class base::RefCountedThreadSafe<BluetoothSocketThread>;
35  BluetoothSocketThread();
36  virtual ~BluetoothSocketThread();
37
38  void EnsureStarted();
39
40  base::ThreadChecker thread_checker_;
41  int active_socket_count_;
42  scoped_ptr<base::Thread> thread_;
43  scoped_refptr<base::SequencedTaskRunner> task_runner_;
44
45  DISALLOW_COPY_AND_ASSIGN(BluetoothSocketThread);
46};
47
48}  // namespace device
49
50#endif  // DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_THREAD_H_
51