instead of using Lock/Unlock attributes, use Assert attribute to annotate code is running on certain task queue or thread. Such check better matches what is checked, in particular allows to recheck (and thus better document) currently used task queue Bug: None Change-Id: I5bc1c397efbc8342cf7915093b578bb015c85651 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/269381 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37619}
90 lines
3.1 KiB
C++
90 lines
3.1 KiB
C++
/*
|
|
* Copyright 2020 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_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H_
|
|
#define RTC_BASE_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H_
|
|
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
#include "api/task_queue/task_queue_base.h"
|
|
#include "rtc_base/platform_thread_types.h"
|
|
#include "rtc_base/synchronization/mutex.h"
|
|
#include "rtc_base/system/rtc_export.h"
|
|
#include "rtc_base/thread_annotations.h"
|
|
|
|
namespace rtc {
|
|
class TaskQueue;
|
|
} // namespace rtc
|
|
|
|
namespace webrtc {
|
|
class SequenceChecker;
|
|
namespace webrtc_sequence_checker_internal {
|
|
|
|
inline void AssertHeld(const SequenceChecker* checker)
|
|
RTC_ASSERT_EXCLUSIVE_LOCK(checker) {}
|
|
inline void AssertHeld(const TaskQueueBase* task_queue)
|
|
RTC_ASSERT_EXCLUSIVE_LOCK(task_queue) {}
|
|
inline void AssertHeld(const rtc::TaskQueue* task_queue)
|
|
RTC_ASSERT_EXCLUSIVE_LOCK(task_queue) {}
|
|
|
|
// Real implementation of SequenceChecker, for use in debug mode, or
|
|
// for temporary use in release mode (e.g. to RTC_CHECK on a threading issue
|
|
// seen only in the wild).
|
|
//
|
|
// Note: You should almost always use the SequenceChecker class to get the
|
|
// right version for your build configuration.
|
|
class RTC_EXPORT SequenceCheckerImpl {
|
|
public:
|
|
SequenceCheckerImpl();
|
|
~SequenceCheckerImpl() = default;
|
|
|
|
bool IsCurrent() const;
|
|
// Changes the task queue or thread that is checked for in IsCurrent. This can
|
|
// be useful when an object may be created on one task queue / thread and then
|
|
// used exclusively on another thread.
|
|
void Detach();
|
|
|
|
// Returns a string that is formatted to match with the error string printed
|
|
// by RTC_CHECK() when a condition is not met.
|
|
// This is used in conjunction with the RTC_DCHECK_RUN_ON() macro.
|
|
std::string ExpectationToString() const;
|
|
|
|
private:
|
|
mutable Mutex lock_;
|
|
// These are mutable so that IsCurrent can set them.
|
|
mutable bool attached_ RTC_GUARDED_BY(lock_);
|
|
mutable rtc::PlatformThreadRef valid_thread_ RTC_GUARDED_BY(lock_);
|
|
mutable const TaskQueueBase* valid_queue_ RTC_GUARDED_BY(lock_);
|
|
mutable const void* valid_system_queue_ RTC_GUARDED_BY(lock_);
|
|
};
|
|
|
|
// Do nothing implementation, for use in release mode.
|
|
//
|
|
// Note: You should almost always use the SequenceChecker class to get the
|
|
// right version for your build configuration.
|
|
class SequenceCheckerDoNothing {
|
|
public:
|
|
bool IsCurrent() const { return true; }
|
|
void Detach() {}
|
|
};
|
|
|
|
std::string ExpectationToString(const SequenceCheckerImpl* checker);
|
|
|
|
// Catch-all implementation for types other than explicitly supported above.
|
|
template <typename ThreadLikeObject>
|
|
std::string ExpectationToString(const ThreadLikeObject*) {
|
|
return std::string();
|
|
}
|
|
|
|
} // namespace webrtc_sequence_checker_internal
|
|
} // namespace webrtc
|
|
|
|
#endif // RTC_BASE_SYNCHRONIZATION_SEQUENCE_CHECKER_INTERNAL_H_
|