diff options
Diffstat (limited to 'third_party/libwebrtc/rtc_base/platform_thread.h')
-rw-r--r-- | third_party/libwebrtc/rtc_base/platform_thread.h | 124 |
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_ |