blob: 5e127c7f41d73617489ebc71d971702a5301d78a [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
Henrik Kjellanderc0362762017-06-29 08:03:04 +020011#ifndef WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_H_
12#define WEBRTC_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.
17#define ENABLE_SEQUENCED_TASK_CHECKER RTC_DCHECK_IS_ON
perkj9c16fe82016-07-12 15:04:07 -070018
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020019#include "webrtc/base/checks.h"
20#include "webrtc/base/constructormagic.h"
21#include "webrtc/base/thread_annotations.h"
22#include "webrtc/base/sequenced_task_checker_impl.h"
perkj9c16fe82016-07-12 15:04:07 -070023
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020024namespace rtc {
25
26// Do nothing implementation, for use in release mode.
27//
28// Note: You should almost always use the SequencedTaskChecker class to get the
29// right version for your build configuration.
30class SequencedTaskCheckerDoNothing {
31 public:
32 bool CalledSequentially() const { return true; }
33
34 void Detach() {}
35};
36
37// SequencedTaskChecker is a helper class used to help verify that some methods
38// of a class are called on the same task queue or thread. A
39// SequencedTaskChecker is bound to a a task queue if the object is
40// created on a task queue, or a thread otherwise.
41//
42//
43// Example:
44// class MyClass {
45// public:
46// void Foo() {
47// RTC_DCHECK(sequence_checker_.CalledSequentially());
48// ... (do stuff) ...
49// }
50//
51// private:
52// SequencedTaskChecker sequence_checker_;
53// }
54//
55// In Release mode, CalledOnValidThread will always return true.
56#if ENABLE_SEQUENCED_TASK_CHECKER
57class LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerImpl {};
58#else
59class LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerDoNothing {};
60#endif // ENABLE_SEQUENCED_TASK_CHECKER_H_
61
62namespace internal {
63class SCOPED_LOCKABLE SequencedTaskCheckerScope {
64 public:
65 explicit SequencedTaskCheckerScope(const SequencedTaskChecker* checker)
66 EXCLUSIVE_LOCK_FUNCTION(checker);
67 ~SequencedTaskCheckerScope() UNLOCK_FUNCTION();
68};
69
70} // namespace internal
71
72#define RTC_DCHECK_CALLED_SEQUENTIALLY(x) \
73 rtc::internal::SequencedTaskCheckerScope checker(x)
74
75#undef ENABLE_SEQUENCED_TASK_CHECKER
76
77} // namespace rtc
Henrik Kjellanderc0362762017-06-29 08:03:04 +020078#endif // WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_H_