summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/rtc_base/platform_thread.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/rtc_base/platform_thread.h')
-rw-r--r--third_party/libwebrtc/rtc_base/platform_thread.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_base/platform_thread.h b/third_party/libwebrtc/rtc_base/platform_thread.h
new file mode 100644
index 0000000000..52497ffd0c
--- /dev/null
+++ b/third_party/libwebrtc/rtc_base/platform_thread.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef RTC_BASE_PLATFORM_THREAD_H_
+#define RTC_BASE_PLATFORM_THREAD_H_
+
+#include <functional>
+#include <string>
+
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "rtc_base/platform_thread_types.h"
+
+#include "rtc_base/deprecated/recursive_critical_section.h"
+
+namespace rtc {
+
+// Bug 1691641
+class PlatformUIThread;
+
+enum class ThreadPriority {
+ kLow = 1,
+ kNormal,
+ kHigh,
+ kRealtime,
+};
+
+struct ThreadAttributes {
+ ThreadPriority priority = ThreadPriority::kNormal;
+ ThreadAttributes& SetPriority(ThreadPriority priority_param) {
+ priority = priority_param;
+ return *this;
+ }
+};
+
+// Represents a simple worker thread.
+class PlatformThread final {
+ public:
+ // 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);
+
+ // Copies won't work since we'd have problems with joinable threads.
+ PlatformThread(const PlatformThread&) = delete;
+ PlatformThread& operator=(const PlatformThread&) = delete;
+
+ // 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();
+
+ // 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;
+
+#if defined(WEBRTC_WIN)
+ // Queue a Windows APC function that runs when the thread is alertable.
+ bool QueueAPC(PAPCFUNC apc_function, ULONG_PTR data);
+#endif
+
+ private:
+ 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;
+ // Bug 1691641
+ friend PlatformUIThread;
+};
+
+} // namespace rtc
+
+#endif // RTC_BASE_PLATFORM_THREAD_H_