aboutsummaryrefslogtreecommitdiff
path: root/rtc_base/platform_thread.h
diff options
context:
space:
mode:
Diffstat (limited to 'rtc_base/platform_thread.h')
-rw-r--r--rtc_base/platform_thread.h143
1 files changed, 76 insertions, 67 deletions
diff --git a/rtc_base/platform_thread.h b/rtc_base/platform_thread.h
index 64a74d8b27..11ccfae3d0 100644
--- a/rtc_base/platform_thread.h
+++ b/rtc_base/platform_thread.h
@@ -11,92 +11,101 @@
#ifndef RTC_BASE_PLATFORM_THREAD_H_
#define RTC_BASE_PLATFORM_THREAD_H_
-#ifndef WEBRTC_WIN
-#include <pthread.h>
-#endif
+#include <functional>
#include <string>
#include "absl/strings/string_view.h"
-#include "api/sequence_checker.h"
-#include "rtc_base/constructor_magic.h"
+#include "absl/types/optional.h"
#include "rtc_base/platform_thread_types.h"
namespace rtc {
-// Callback function that the spawned thread will enter once spawned.
-typedef void (*ThreadRunFunction)(void*);
+enum class ThreadPriority {
+ kLow = 1,
+ kNormal,
+ kHigh,
+ kRealtime,
+};
-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
+struct ThreadAttributes {
+ ThreadPriority priority = ThreadPriority::kNormal;
+ ThreadAttributes& SetPriority(ThreadPriority priority_param) {
+ priority = priority_param;
+ return *this;
+ }
};
-// 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.
-class PlatformThread {
+// Represents a simple worker thread.
+class PlatformThread final {
public:
- PlatformThread(ThreadRunFunction func,
- void* obj,
- absl::string_view thread_name,
- ThreadPriority priority = kNormalPriority);
+ // Handle is the base platform thread handle.
+#if defined(WEBRTC_WIN)
+ using Handle = HANDLE;
+#else
+ using Handle = pthread_t;
+#endif // defined(WEBRTC_WIN)
+ // This ctor creates the PlatformThread with an unset handle (returning true
+ // in empty()) and is provided for convenience.
+ // TODO(bugs.webrtc.org/12727) Look into if default and move support can be
+ // removed.
+ PlatformThread() = default;
+
+ // Moves |rhs| into this, storing an empty state in |rhs|.
+ // TODO(bugs.webrtc.org/12727) Look into if default and move support can be
+ // removed.
+ PlatformThread(PlatformThread&& rhs);
+
+ // Moves |rhs| into this, storing an empty state in |rhs|.
+ // TODO(bugs.webrtc.org/12727) Look into if default and move support can be
+ // removed.
+ PlatformThread& operator=(PlatformThread&& rhs);
+
+ // For a PlatformThread that's been spawned joinable, the destructor suspends
+ // the calling thread until the created thread exits unless the thread has
+ // already exited.
virtual ~PlatformThread();
- const std::string& name() const { return name_; }
-
- // Spawns a thread and tries to set thread priority according to the priority
- // from when CreateThread was called.
- void Start();
+ // Finalizes any allocated resources.
+ // For a PlatformThread that's been spawned joinable, Finalize() suspends
+ // the calling thread until the created thread exits unless the thread has
+ // already exited.
+ // empty() returns true after completion.
+ void Finalize();
+
+ // Returns true if default constructed, moved from, or Finalize()ed.
+ bool empty() const { return !handle_.has_value(); }
+
+ // Creates a started joinable thread which will be joined when the returned
+ // PlatformThread destructs or Finalize() is called.
+ static PlatformThread SpawnJoinable(
+ std::function<void()> thread_function,
+ absl::string_view name,
+ ThreadAttributes attributes = ThreadAttributes());
+
+ // Creates a started detached thread. The caller has to use external
+ // synchronization as nothing is provided by the PlatformThread construct.
+ static PlatformThread SpawnDetached(
+ std::function<void()> thread_function,
+ absl::string_view name,
+ ThreadAttributes attributes = ThreadAttributes());
+
+ // Returns the base platform thread handle of this thread.
+ absl::optional<Handle> GetHandle() const;
- bool IsRunning() const;
-
- // Returns an identifier for the worker thread that can be used to do
- // thread checks.
- PlatformThreadRef GetThreadRef() const;
-
- // Stops (joins) the spawned thread.
- void Stop();
-
- protected:
#if defined(WEBRTC_WIN)
- // Exposed to derived classes to allow for special cases specific to Windows.
+ // Queue a Windows APC function that runs when the thread is alertable.
bool QueueAPC(PAPCFUNC apc_function, ULONG_PTR data);
#endif
private:
- void Run();
- bool SetPriority(ThreadPriority priority);
-
- ThreadRunFunction const run_function_ = nullptr;
- const ThreadPriority priority_ = kNormalPriority;
- 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_;
- webrtc::SequenceChecker thread_checker_;
- webrtc::SequenceChecker spawned_thread_checker_;
-#if defined(WEBRTC_WIN)
- static DWORD WINAPI StartThread(void* param);
-
- HANDLE thread_ = nullptr;
- DWORD thread_id_ = 0;
-#else
- static void* StartThread(void* param);
-
- pthread_t thread_ = 0;
-#endif // defined(WEBRTC_WIN)
- RTC_DISALLOW_COPY_AND_ASSIGN(PlatformThread);
+ PlatformThread(Handle handle, bool joinable);
+ static PlatformThread SpawnThread(std::function<void()> thread_function,
+ absl::string_view name,
+ ThreadAttributes attributes,
+ bool joinable);
+
+ absl::optional<Handle> handle_;
+ bool joinable_ = false;
};
} // namespace rtc