blob: cc308e45b731dd4f09ed176ba661c94d5e52e061 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 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
Markus Handell3cb525b2020-07-16 16:16:09 +020011#ifndef RTC_BASE_DEPRECATED_RECURSIVE_CRITICAL_SECTION_H_
12#define RTC_BASE_DEPRECATED_RECURSIVE_CRITICAL_SECTION_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "rtc_base/platform_thread_types.h"
15#include "rtc_base/thread_annotations.h"
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020016
17#if defined(WEBRTC_WIN)
Yves Gerey665174f2018-06-19 15:03:05 +020018// clang-format off
19// clang formating would change include order.
20
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020021// Include winsock2.h before including <windows.h> to maintain consistency with
Niels Möllerb06b0a62018-05-25 10:05:34 +020022// win32.h. To include win32.h directly, it must be broken out into its own
23// build target.
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020024#include <winsock2.h>
25#include <windows.h>
26#include <sal.h> // must come after windows headers.
Yves Gerey665174f2018-06-19 15:03:05 +020027// clang-format on
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020028#endif // defined(WEBRTC_WIN)
29
30#if defined(WEBRTC_POSIX)
31#include <pthread.h>
32#endif
33
34// See notes in the 'Performance' unit test for the effects of this flag.
Mirko Bonadeia0eefc12019-07-08 14:11:02 +020035#define RTC_USE_NATIVE_MUTEX_ON_MAC 1
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020036
Mirko Bonadeia0eefc12019-07-08 14:11:02 +020037#if defined(WEBRTC_MAC) && !RTC_USE_NATIVE_MUTEX_ON_MAC
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020038#include <dispatch/dispatch.h>
39#endif
40
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020041namespace rtc {
42
Markus Handell3cb525b2020-07-16 16:16:09 +020043// NOTE: This class is deprecated. Please use webrtc::Mutex instead!
44// Search using https://www.google.com/?q=recursive+lock+considered+harmful
45// to find the reasons.
46//
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020047// Locking methods (Enter, TryEnter, Leave)are const to permit protecting
Markus Handell3cb525b2020-07-16 16:16:09 +020048// members inside a const context without requiring mutable
49// RecursiveCriticalSections everywhere. RecursiveCriticalSection is
50// reentrant lock.
51class RTC_LOCKABLE RecursiveCriticalSection {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020052 public:
Markus Handell3cb525b2020-07-16 16:16:09 +020053 RecursiveCriticalSection();
54 ~RecursiveCriticalSection();
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020055
danilchap3c6abd22017-09-06 05:46:29 -070056 void Enter() const RTC_EXCLUSIVE_LOCK_FUNCTION();
57 bool TryEnter() const RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true);
58 void Leave() const RTC_UNLOCK_FUNCTION();
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020059
60 private:
61 // Use only for RTC_DCHECKing.
62 bool CurrentThreadIsOwner() const;
63
64#if defined(WEBRTC_WIN)
65 mutable CRITICAL_SECTION crit_;
66#elif defined(WEBRTC_POSIX)
Mirko Bonadeia0eefc12019-07-08 14:11:02 +020067#if defined(WEBRTC_MAC) && !RTC_USE_NATIVE_MUTEX_ON_MAC
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020068 // Number of times the lock has been locked + number of threads waiting.
69 // TODO(tommi): We could use this number and subtract the recursion count
70 // to find places where we have multiple threads contending on the same lock.
71 mutable volatile int lock_queue_;
Artem Titov96e3b992021-07-26 16:03:14 +020072 // `recursion_` represents the recursion count + 1 for the thread that owns
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020073 // the lock. Only modified by the thread that owns the lock.
74 mutable int recursion_;
75 // Used to signal a single waiting thread when the lock becomes available.
76 mutable dispatch_semaphore_t semaphore_;
77 // The thread that currently holds the lock. Required to handle recursion.
78 mutable PlatformThreadRef owning_thread_;
Yves Gerey665174f2018-06-19 15:03:05 +020079#else
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020080 mutable pthread_mutex_t mutex_;
Yves Gerey665174f2018-06-19 15:03:05 +020081#endif
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020082 mutable PlatformThreadRef thread_; // Only used by RTC_DCHECKs.
83 mutable int recursion_count_; // Only used by RTC_DCHECKs.
84#else // !defined(WEBRTC_WIN) && !defined(WEBRTC_POSIX)
Yves Gerey665174f2018-06-19 15:03:05 +020085#error Unsupported platform.
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020086#endif
87};
88
89// CritScope, for serializing execution through a scope.
danilchap3c6abd22017-09-06 05:46:29 -070090class RTC_SCOPED_LOCKABLE CritScope {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020091 public:
Markus Handell3cb525b2020-07-16 16:16:09 +020092 explicit CritScope(const RecursiveCriticalSection* cs)
93 RTC_EXCLUSIVE_LOCK_FUNCTION(cs);
danilchap3c6abd22017-09-06 05:46:29 -070094 ~CritScope() RTC_UNLOCK_FUNCTION();
95
Byoungchan Lee14af7622022-01-12 05:24:58 +090096 CritScope(const CritScope&) = delete;
97 CritScope& operator=(const CritScope&) = delete;
98
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020099 private:
Markus Handell3cb525b2020-07-16 16:16:09 +0200100 const RecursiveCriticalSection* const cs_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200101};
102
Yves Gerey665174f2018-06-19 15:03:05 +0200103} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000104
Markus Handell3cb525b2020-07-16 16:16:09 +0200105#endif // RTC_BASE_DEPRECATED_RECURSIVE_CRITICAL_SECTION_H_