1/*
2 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_PLATFORM_THREAD_H_
12#define WEBRTC_BASE_PLATFORM_THREAD_H_
13
14#include <string>
15
16#include "webrtc/base/constructormagic.h"
17#include "webrtc/base/event.h"
18#include "webrtc/base/platform_thread_types.h"
19#include "webrtc/base/scoped_ptr.h"
20#include "webrtc/base/thread_checker.h"
21
22namespace rtc {
23
24PlatformThreadId CurrentThreadId();
25PlatformThreadRef CurrentThreadRef();
26
27// Compares two thread identifiers for equality.
28bool IsThreadRefEqual(const PlatformThreadRef& a, const PlatformThreadRef& b);
29
30// Sets the current thread name.
31void SetCurrentThreadName(const char* name);
32
33// Callback function that the spawned thread will enter once spawned.
34// A return value of false is interpreted as that the function has no
35// more work to do and that the thread can be released.
36typedef bool (*ThreadRunFunction)(void*);
37
38enum ThreadPriority {
39#ifdef WEBRTC_WIN
40  kLowPriority = THREAD_PRIORITY_BELOW_NORMAL,
41  kNormalPriority = THREAD_PRIORITY_NORMAL,
42  kHighPriority = THREAD_PRIORITY_ABOVE_NORMAL,
43  kHighestPriority = THREAD_PRIORITY_HIGHEST,
44  kRealtimePriority = THREAD_PRIORITY_TIME_CRITICAL
45#else
46  kLowPriority = 1,
47  kNormalPriority = 2,
48  kHighPriority = 3,
49  kHighestPriority = 4,
50  kRealtimePriority = 5
51#endif
52};
53
54// Represents a simple worker thread.  The implementation must be assumed
55// to be single threaded, meaning that all methods of the class, must be
56// called from the same thread, including instantiation.
57class PlatformThread {
58 public:
59  PlatformThread(ThreadRunFunction func, void* obj, const char* thread_name);
60  virtual ~PlatformThread();
61
62  // Spawns a thread and tries to set thread priority according to the priority
63  // from when CreateThread was called.
64  void Start();
65
66  bool IsRunning() const;
67
68  // Stops (joins) the spawned thread.
69  void Stop();
70
71  // Set the priority of the thread. Must be called when thread is running.
72  bool SetPriority(ThreadPriority priority);
73
74 private:
75  void Run();
76
77  ThreadRunFunction const run_function_;
78  void* const obj_;
79  // TODO(pbos): Make sure call sites use string literals and update to a const
80  // char* instead of a std::string.
81  const std::string name_;
82  rtc::ThreadChecker thread_checker_;
83#if defined(WEBRTC_WIN)
84  static DWORD WINAPI StartThread(void* param);
85
86  bool stop_;
87  HANDLE thread_;
88#else
89  static void* StartThread(void* param);
90
91  rtc::Event stop_event_;
92
93  pthread_t thread_;
94#endif  // defined(WEBRTC_WIN)
95  RTC_DISALLOW_COPY_AND_ASSIGN(PlatformThread);
96};
97
98}  // namespace rtc
99
100#endif  // WEBRTC_BASE_PLATFORM_THREAD_H_
101