src/core/lib/gprpp/sync.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2019 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPC_CORE_LIB_GPRPP_SYNC_H
20 #define GRPC_CORE_LIB_GPRPP_SYNC_H
21 
23 
24 #include "absl/base/thread_annotations.h"
25 #include "absl/synchronization/mutex.h"
26 
27 #include <grpc/support/log.h>
28 #include <grpc/support/sync.h>
29 
30 #ifndef GPR_ABSEIL_SYNC
32 #endif
33 
34 // The core library is not accessible in C++ codegen headers, and vice versa.
35 // Thus, we need to have duplicate headers with similar functionality.
36 // Make sure any change to this file is also reflected in
37 // include/grpcpp/impl/codegen/sync.h.
38 //
39 // Whenever possible, prefer using this file over <grpcpp/impl/codegen/sync.h>
40 // since this file doesn't rely on g_core_codegen_interface and hence does not
41 // pay the costs of virtual function calls.
42 
43 namespace grpc_core {
44 
45 #ifdef GPR_ABSEIL_SYNC
46 
47 using Mutex = absl::Mutex;
49 using ReleasableMutexLock = absl::ReleasableMutexLock;
50 using CondVar = absl::CondVar;
51 
52 // Returns the underlying gpr_mu from Mutex. This should be used only when
53 // it has to like passing the C++ mutex to C-core API.
54 // TODO(veblush): Remove this after C-core no longer uses gpr_mu.
56  return reinterpret_cast<gpr_mu*>(mutex);
57 }
58 
59 #else
60 
62  public:
65 
66  Mutex(const Mutex&) = delete;
67  Mutex& operator=(const Mutex&) = delete;
68 
72  return gpr_mu_trylock(&mu_) != 0;
73  }
75 
76  private:
78 
79  friend class CondVar;
81 };
82 
83 // Returns the underlying gpr_mu from Mutex. This should be used only when
84 // it has to like passing the C++ mutex to C-core API.
85 // TODO(veblush): Remove this after C-core no longer uses gpr_mu.
86 inline gpr_mu* GetUnderlyingGprMu(Mutex* mutex) { return &mutex->mu_; }
87 
89  public:
91  mu_->Lock();
92  }
93  ~MutexLock() ABSL_UNLOCK_FUNCTION() { mu_->Unlock(); }
94 
95  MutexLock(const MutexLock&) = delete;
96  MutexLock& operator=(const MutexLock&) = delete;
97 
98  private:
99  Mutex* const mu_;
100 };
101 
103  public:
105  : mu_(mu) {
106  mu_->Lock();
107  }
109  if (!released_) mu_->Unlock();
110  }
111 
112  ReleasableMutexLock(const ReleasableMutexLock&) = delete;
113  ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete;
114 
116  GPR_DEBUG_ASSERT(!released_);
117  released_ = true;
118  mu_->Unlock();
119  }
120 
121  private:
122  Mutex* const mu_;
123  bool released_ = false;
124 };
125 
126 class CondVar {
127  public:
130 
131  CondVar(const CondVar&) = delete;
132  CondVar& operator=(const CondVar&) = delete;
133 
134  void Signal() { gpr_cv_signal(&cv_); }
136 
139  return gpr_cv_wait(&cv_, &mu->mu_, ToGprTimeSpec(timeout)) != 0;
140  }
141  bool WaitWithDeadline(Mutex* mu, absl::Time deadline) {
142  return gpr_cv_wait(&cv_, &mu->mu_, ToGprTimeSpec(deadline)) != 0;
143  }
144 
145  private:
147 };
148 
149 #endif // GPR_ABSEIL_SYNC
150 
151 // Deprecated. Prefer MutexLock
153  public:
156 
157  MutexLockForGprMu(const MutexLock&) = delete;
158  MutexLockForGprMu& operator=(const MutexLock&) = delete;
159 
160  private:
161  gpr_mu* const mu_;
162 };
163 
164 // Deprecated. Prefer MutexLock or ReleasableMutexLock
166  public:
169  : mu_(mu) {
170  mu_->Lock();
171  }
173  if (!released_) mu_->Unlock();
174  }
175 
177  delete;
179  const LockableAndReleasableMutexLock&) = delete;
180 
182  GPR_DEBUG_ASSERT(released_);
183  mu_->Lock();
184  released_ = false;
185  }
186 
188  GPR_DEBUG_ASSERT(!released_);
189  released_ = true;
190  mu_->Unlock();
191  }
192 
193  private:
194  Mutex* const mu_;
195  bool released_ = false;
196 };
197 
198 } // namespace grpc_core
199 
200 #endif /* GRPC_CORE_LIB_GPRPP_SYNC_H */
grpc_core::ReleasableMutexLock::~ReleasableMutexLock
~ReleasableMutexLock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:108
gpr_cv_signal
GPRAPI void gpr_cv_signal(gpr_cv *cv)
grpc_core::CondVar::WaitWithTimeout
bool WaitWithTimeout(Mutex *mu, absl::Duration timeout)
Definition: src/core/lib/gprpp/sync.h:138
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
grpc_core::CondVar
Definition: src/core/lib/gprpp/sync.h:126
grpc_core::LockableAndReleasableMutexLock::Lock
void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:181
log.h
MutexLock
#define MutexLock(x)
Definition: bloaty/third_party/re2/util/mutex.h:125
grpc_core::CondVar::~CondVar
~CondVar()
Definition: src/core/lib/gprpp/sync.h:129
grpc_core::CondVar::CondVar
CondVar()
Definition: src/core/lib/gprpp/sync.h:128
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
absl::Time
Definition: third_party/abseil-cpp/absl/time/time.h:642
mutex
static uv_mutex_t mutex
Definition: threadpool.c:34
grpc_core::MutexLockForGprMu
Definition: src/core/lib/gprpp/sync.h:152
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::LockableAndReleasableMutexLock::mu_
Mutex *const mu_
Definition: src/core/lib/gprpp/sync.h:194
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
gpr_cv
pthread_cond_t gpr_cv
Definition: impl/codegen/sync_posix.h:48
grpc_core::ReleasableMutexLock::Release
void Release() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:115
grpc_core::ToGprTimeSpec
gpr_timespec ToGprTimeSpec(absl::Duration duration)
Definition: src/core/lib/gprpp/time_util.cc:29
time_util.h
grpc_core::CondVar::cv_
gpr_cv cv_
Definition: src/core/lib/gprpp/sync.h:146
true
#define true
Definition: setup_once.h:324
mu_
Mutex mu_
Definition: oob_backend_metric.cc:115
grpc_core::MutexLock::~MutexLock
~MutexLock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:93
grpc_core::LockableAndReleasableMutexLock::LockableAndReleasableMutexLock
LockableAndReleasableMutexLock(Mutex *mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
Definition: src/core/lib/gprpp/sync.h:167
gpr_mu_destroy
GPRAPI void gpr_mu_destroy(gpr_mu *mu)
grpc_core::CondVar::SignalAll
void SignalAll()
Definition: src/core/lib/gprpp/sync.h:135
grpc_core::LockableAndReleasableMutexLock
Definition: src/core/lib/gprpp/sync.h:165
grpc_core::Mutex::Lock
void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:69
gpr_cv_destroy
GPRAPI void gpr_cv_destroy(gpr_cv *cv)
grpc_core::LockableAndReleasableMutexLock::~LockableAndReleasableMutexLock
~LockableAndReleasableMutexLock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:172
mu
Mutex mu
Definition: server_config_selector_filter.cc:74
grpc_core::ReleasableMutexLock
Definition: src/core/lib/gprpp/sync.h:102
grpc_core::MutexLock::mu_
Mutex *const mu_
Definition: src/core/lib/gprpp/sync.h:99
gpr_mu_init
GPRAPI void gpr_mu_init(gpr_mu *mu)
grpc_core::MutexLock::MutexLock
MutexLock(Mutex *mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
Definition: src/core/lib/gprpp/sync.h:90
grpc_core::CondVar::Signal
void Signal()
Definition: src/core/lib/gprpp/sync.h:134
gpr_cv_wait
GPRAPI int gpr_cv_wait(gpr_cv *cv, gpr_mu *mu, gpr_timespec abs_deadline)
ABSL_EXCLUSIVE_TRYLOCK_FUNCTION
#define ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:243
absl::Duration
Definition: third_party/abseil-cpp/absl/time/time.h:159
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
grpc_core::LockableAndReleasableMutexLock::Release
void Release() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:187
grpc_core::CondVar::WaitWithDeadline
bool WaitWithDeadline(Mutex *mu, absl::Time deadline)
Definition: src/core/lib/gprpp/sync.h:141
grpc_core::MutexLockForGprMu::operator=
MutexLockForGprMu & operator=(const MutexLock &)=delete
grpc_core::Mutex::mu_
gpr_mu mu_
Definition: src/core/lib/gprpp/sync.h:77
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
grpc_core::Mutex::Unlock
void Unlock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:70
grpc_core::MutexLockForGprMu::~MutexLockForGprMu
~MutexLockForGprMu()
Definition: src/core/lib/gprpp/sync.h:155
grpc_core::CondVar::operator=
CondVar & operator=(const CondVar &)=delete
grpc_core::Mutex::~Mutex
~Mutex()
Definition: src/core/lib/gprpp/sync.h:64
ABSL_EXCLUSIVE_LOCK_FUNCTION
#define ABSL_EXCLUSIVE_LOCK_FUNCTION(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:207
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
absl::ReleasableMutexLock
Definition: abseil-cpp/absl/synchronization/mutex.h:914
absl::CondVar
Definition: abseil-cpp/absl/synchronization/mutex.h:798
gpr_mu_trylock
GPRAPI int gpr_mu_trylock(gpr_mu *mu)
grpc_core::MutexLockForGprMu::mu_
gpr_mu *const mu_
Definition: src/core/lib/gprpp/sync.h:161
grpc_core::Mutex::TryLock
bool TryLock() ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(true)
Definition: src/core/lib/gprpp/sync.h:71
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
grpc_core::CondVar::Wait
void Wait(Mutex *mu)
Definition: src/core/lib/gprpp/sync.h:137
grpc_core::GetUnderlyingGprMu
gpr_mu * GetUnderlyingGprMu(Mutex *mutex)
Definition: src/core/lib/gprpp/sync.h:86
grpc_core::MutexLockForGprMu::MutexLockForGprMu
MutexLockForGprMu(gpr_mu *mu)
Definition: src/core/lib/gprpp/sync.h:154
gpr_cv_broadcast
GPRAPI void gpr_cv_broadcast(gpr_cv *cv)
ABSL_ASSERT_EXCLUSIVE_LOCK
#define ABSL_ASSERT_EXCLUSIVE_LOCK(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:261
grpc_core::Mutex::Mutex
Mutex()
Definition: src/core/lib/gprpp/sync.h:63
grpc_core::ReleasableMutexLock::ReleasableMutexLock
ReleasableMutexLock(Mutex *mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
Definition: src/core/lib/gprpp/sync.h:104
ABSL_UNLOCK_FUNCTION
#define ABSL_UNLOCK_FUNCTION(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:228
ABSL_LOCKABLE
#define ABSL_LOCKABLE
Definition: abseil-cpp/absl/base/thread_annotations.h:183
sync.h
grpc_core::Mutex::AssertHeld
void AssertHeld() ABSL_ASSERT_EXCLUSIVE_LOCK()
Definition: src/core/lib/gprpp/sync.h:74
grpc_core::ReleasableMutexLock::mu_
Mutex *const mu_
Definition: src/core/lib/gprpp/sync.h:122
timeout
uv_timer_t timeout
Definition: libuv/docs/code/uvwget/main.c:9
ABSL_SCOPED_LOCKABLE
#define ABSL_SCOPED_LOCKABLE
Definition: abseil-cpp/absl/base/thread_annotations.h:196
absl::InfiniteFuture
constexpr Time InfiniteFuture()
Definition: third_party/abseil-cpp/absl/time/time.h:760
gpr_cv_init
GPRAPI void gpr_cv_init(gpr_cv *cv)
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:24