Chromium Code Reviews| Index: webrtc/base/platform_thread.h |
| diff --git a/webrtc/base/platform_thread.h b/webrtc/base/platform_thread.h |
| index 50033b39282e976cd3f3f4ec35cb52b641249843..e2d9b337e464ecc2e88d83da2615be04cd34f97e 100644 |
| --- a/webrtc/base/platform_thread.h |
| +++ b/webrtc/base/platform_thread.h |
| @@ -11,23 +11,15 @@ |
| #ifndef WEBRTC_BASE_PLATFORM_THREAD_H_ |
| #define WEBRTC_BASE_PLATFORM_THREAD_H_ |
| -#if defined(WEBRTC_WIN) |
| -#include <winsock2.h> |
| -#include <windows.h> |
| -#elif defined(WEBRTC_POSIX) |
| -#include <pthread.h> |
| -#include <unistd.h> |
| -#endif |
| +#include <string> |
| -namespace rtc { |
| +#include "webrtc/base/constructormagic.h" |
| +#include "webrtc/base/event.h" |
| +#include "webrtc/base/platform_thread_types.h" |
| +#include "webrtc/base/scoped_ptr.h" |
| +#include "webrtc/base/thread_checker.h" |
| -#if defined(WEBRTC_WIN) |
| -typedef DWORD PlatformThreadId; |
| -typedef DWORD PlatformThreadRef; |
| -#elif defined(WEBRTC_POSIX) |
| -typedef pid_t PlatformThreadId; |
| -typedef pthread_t PlatformThreadRef; |
| -#endif |
| +namespace rtc { |
| PlatformThreadId CurrentThreadId(); |
| PlatformThreadRef CurrentThreadRef(); |
| @@ -40,4 +32,96 @@ void SetCurrentThreadName(const char* name); |
| } // namespace rtc |
| +// TODO(pbos): Merge with namespace rtc. |
| +namespace webrtc { |
|
tommi
2015/11/23 15:54:28
nit: threading?
(or is there a reason for having r
pbos-webrtc
2015/11/23 16:18:22
Not under rtc, this is just webrtc::. Not moved ye
tommi
2015/11/23 16:51:50
Acknowledged.
|
| + |
| +// Callback function that the spawned thread will enter once spawned. |
| +// A return value of false is interpreted as that the function has no |
| +// more work to do and that the thread can be released. |
| +typedef bool (*ThreadRunFunction)(void*); |
| + |
| +enum ThreadPriority { |
| +#ifdef WEBRTC_WIN |
| + kLowPriority = THREAD_PRIORITY_BELOW_NORMAL, |
| + kNormalPriority = THREAD_PRIORITY_NORMAL, |
| + kHighPriority = THREAD_PRIORITY_ABOVE_NORMAL, |
| + kHighestPriority = THREAD_PRIORITY_HIGHEST, |
| + kRealtimePriority = THREAD_PRIORITY_TIME_CRITICAL |
| +#else |
| + kLowPriority = 1, |
| + kNormalPriority = 2, |
| + kHighPriority = 3, |
| + kHighestPriority = 4, |
| + kRealtimePriority = 5 |
| +#endif |
| +}; |
| + |
| +// Represents a simple worker thread. The implementation must be assumed |
| +// to be single threaded, meaning that all methods of the class, must be |
| +// called from the same thread, including instantiation. |
| +// TODO(tommi): There's no need for this to be a virtual interface since there's |
| +// only ever a single implementation of it. |
| +class PlatformThread { |
| + public: |
| + PlatformThread(ThreadRunFunction func, void* obj, const char* thread_name); |
| + virtual ~PlatformThread(); |
| + |
| + // Factory method. Constructor disabled. |
| + // |
| + // func Pointer to a, by user, specified callback function. |
| + // obj Object associated with the thread. Passed in the callback |
| + // function. |
| + // prio Thread priority. May require root/admin rights. |
| + // thread_name NULL terminated thread name, will be visable in the Windows |
| + // debugger. |
| + // TODO(pbos): Move users onto explicit initialization/member ownership |
| + // instead of additional heap allocation due to CreateThread. |
| + static rtc::scoped_ptr<PlatformThread> CreateThread(ThreadRunFunction func, |
| + void* obj, |
| + const char* thread_name); |
| + |
| + // Tries to spawns a thread and returns true if that was successful. |
| + // Additionally, it tries to set thread priority according to the priority |
| + // from when CreateThread was called. However, failure to set priority will |
| + // not result in a false return value. |
| + // TODO(pbos): Make void not war. |
| + bool Start(); |
| + |
| + // Stops the spawned thread and waits for it to be reclaimed with a timeout |
| + // of two seconds. Will return false if the thread was not reclaimed. |
| + // Multiple tries to Stop are allowed (e.g. to wait longer than 2 seconds). |
| + // It's ok to call Stop() even if the spawned thread has been reclaimed. |
| + // TODO(pbos): Make void not war. |
| + bool Stop(); |
| + |
| + // Set the priority of the worker thread. Must be called when thread |
| + // is running. |
| + bool SetPriority(ThreadPriority priority); |
| + |
| + private: |
| + void Run(); |
| + |
| + ThreadRunFunction const run_function_; |
| + void* const obj_; |
| + // TODO(pbos): Make sure call sites use string literals and update to a const |
| + // char* instead of a std::string. |
| + const std::string name_; |
| + rtc::ThreadChecker thread_checker_; |
| +#if defined(WEBRTC_WIN) |
| + static DWORD WINAPI StartThread(void* param); |
| + |
| + bool stop_; |
| + HANDLE thread_; |
| +#else |
| + static void* StartThread(void* param); |
| + |
| + rtc::Event stop_event_; |
| + |
| + pthread_t thread_; |
| +#endif // defined(WEBRTC_WIN) |
| + RTC_DISALLOW_COPY_AND_ASSIGN(PlatformThread); |
| +}; |
| + |
| +} // namespace webrtc |
| + |
| #endif // WEBRTC_BASE_PLATFORM_THREAD_H_ |