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 RTC_BASE_PLATFORM_THREAD_H_ 12 #define RTC_BASE_PLATFORM_THREAD_H_ 13 14 #ifndef WEBRTC_WIN 15 #include <pthread.h> 16 #endif 17 #include <string> 18 19 #include "absl/strings/string_view.h" 20 #include "rtc_base/constructor_magic.h" 21 #include "rtc_base/platform_thread_types.h" 22 #include "rtc_base/thread_checker.h" 23 24 namespace rtc { 25 26 // Callback function that the spawned thread will enter once spawned. 27 typedef void (*ThreadRunFunction)(void*); 28 29 enum ThreadPriority { 30 #ifdef WEBRTC_WIN 31 kLowPriority = THREAD_PRIORITY_BELOW_NORMAL, 32 kNormalPriority = THREAD_PRIORITY_NORMAL, 33 kHighPriority = THREAD_PRIORITY_ABOVE_NORMAL, 34 kHighestPriority = THREAD_PRIORITY_HIGHEST, 35 kRealtimePriority = THREAD_PRIORITY_TIME_CRITICAL 36 #else 37 kLowPriority = 1, 38 kNormalPriority = 2, 39 kHighPriority = 3, 40 kHighestPriority = 4, 41 kRealtimePriority = 5 42 #endif 43 }; 44 45 // Represents a simple worker thread. The implementation must be assumed 46 // to be single threaded, meaning that all methods of the class, must be 47 // called from the same thread, including instantiation. 48 class PlatformThread { 49 public: 50 PlatformThread(ThreadRunFunction func, 51 void* obj, 52 absl::string_view thread_name, 53 ThreadPriority priority = kNormalPriority); 54 virtual ~PlatformThread(); 55 name()56 const std::string& name() const { return name_; } 57 58 // Spawns a thread and tries to set thread priority according to the priority 59 // from when CreateThread was called. 60 void Start(); 61 62 bool IsRunning() const; 63 64 // Returns an identifier for the worker thread that can be used to do 65 // thread checks. 66 PlatformThreadRef GetThreadRef() const; 67 68 // Stops (joins) the spawned thread. 69 void Stop(); 70 71 protected: 72 #if defined(WEBRTC_WIN) 73 // Exposed to derived classes to allow for special cases specific to Windows. 74 bool QueueAPC(PAPCFUNC apc_function, ULONG_PTR data); 75 #endif 76 77 private: 78 void Run(); 79 bool SetPriority(ThreadPriority priority); 80 81 ThreadRunFunction const run_function_ = nullptr; 82 const ThreadPriority priority_ = kNormalPriority; 83 void* const obj_; 84 // TODO(pbos): Make sure call sites use string literals and update to a const 85 // char* instead of a std::string. 86 const std::string name_; 87 rtc::ThreadChecker thread_checker_; 88 rtc::ThreadChecker spawned_thread_checker_; 89 #if defined(WEBRTC_WIN) 90 static DWORD WINAPI StartThread(void* param); 91 92 HANDLE thread_ = nullptr; 93 DWORD thread_id_ = 0; 94 #else 95 static void* StartThread(void* param); 96 97 pthread_t thread_ = 0; 98 #endif // defined(WEBRTC_WIN) 99 RTC_DISALLOW_COPY_AND_ASSIGN(PlatformThread); 100 }; 101 102 } // namespace rtc 103 104 #endif // RTC_BASE_PLATFORM_THREAD_H_ 105