blob: e5443afe5a50e6aeb93c1ccc28ac7e712b523201 [file] [log] [blame]
perkj9c16fe82016-07-12 15:04:07 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_SEQUENCED_TASK_CHECKER_H_
12#define RTC_BASE_SEQUENCED_TASK_CHECKER_H_
perkj9c16fe82016-07-12 15:04:07 -070013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014// Apart from debug builds, we also enable the sequence checker in
15// builds with RTC_DCHECK_IS_ON so that trybots and waterfall bots
16// with this define will get the same level of checking as debug bots.
danilchap42a70e32017-09-06 01:38:35 -070017#define ENABLE_SEQUENCED_TASK_CHECKER RTC_DCHECK_IS_ON
perkj9c16fe82016-07-12 15:04:07 -070018
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "rtc_base/constructor_magic.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "rtc_base/sequenced_task_checker_impl.h"
22#include "rtc_base/thread_annotations.h"
perkj9c16fe82016-07-12 15:04:07 -070023
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020024namespace rtc {
Tommi10b40ce2018-02-19 13:34:00 +010025namespace internal {
26// Forward declaration of the internal implementation of RTC_GUARDED_BY().
27// SequencedTaskChecker grants this class access to call its IsCurrent() method.
28// See thread_checker.h for more details.
29class AnnounceOnThread;
30} // namespace internal
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020031
32// Do nothing implementation, for use in release mode.
33//
34// Note: You should almost always use the SequencedTaskChecker class to get the
35// right version for your build configuration.
36class SequencedTaskCheckerDoNothing {
37 public:
38 bool CalledSequentially() const { return true; }
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020039 void Detach() {}
Tommi10b40ce2018-02-19 13:34:00 +010040
41 private:
42 friend class internal::AnnounceOnThread;
43 bool IsCurrent() const { return CalledSequentially(); }
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020044};
45
46// SequencedTaskChecker is a helper class used to help verify that some methods
47// of a class are called on the same task queue or thread. A
48// SequencedTaskChecker is bound to a a task queue if the object is
49// created on a task queue, or a thread otherwise.
50//
51//
52// Example:
53// class MyClass {
54// public:
55// void Foo() {
56// RTC_DCHECK(sequence_checker_.CalledSequentially());
57// ... (do stuff) ...
58// }
59//
60// private:
61// SequencedTaskChecker sequence_checker_;
62// }
63//
64// In Release mode, CalledOnValidThread will always return true.
danilchap42a70e32017-09-06 01:38:35 -070065#if ENABLE_SEQUENCED_TASK_CHECKER
danilchap3c6abd22017-09-06 05:46:29 -070066class RTC_LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerImpl {};
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020067#else
danilchap3c6abd22017-09-06 05:46:29 -070068class RTC_LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerDoNothing {
69};
danilchap42a70e32017-09-06 01:38:35 -070070#endif // ENABLE_SEQUENCED_TASK_CHECKER_H_
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020071
72namespace internal {
danilchap3c6abd22017-09-06 05:46:29 -070073class RTC_SCOPED_LOCKABLE SequencedTaskCheckerScope {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020074 public:
75 explicit SequencedTaskCheckerScope(const SequencedTaskChecker* checker)
danilchap3c6abd22017-09-06 05:46:29 -070076 RTC_EXCLUSIVE_LOCK_FUNCTION(checker);
77 ~SequencedTaskCheckerScope() RTC_UNLOCK_FUNCTION();
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020078};
79
80} // namespace internal
81
82#define RTC_DCHECK_CALLED_SEQUENTIALLY(x) \
83 rtc::internal::SequencedTaskCheckerScope checker(x)
84
danilchap42a70e32017-09-06 01:38:35 -070085#undef ENABLE_SEQUENCED_TASK_CHECKER
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020086
87} // namespace rtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020088#endif // RTC_BASE_SEQUENCED_TASK_CHECKER_H_