16 #include "absl/base/thread_annotations.h"
17 #include "absl/status/status.h"
18 #include "absl/status/statusor.h"
19 #include "absl/synchronization/mutex.h"
20 #include "absl/log/check.h"
25 Tracker& tracker) ABSL_NO_THREAD_SAFETY_ANALYSIS {
27 const absl::MutexLock lock(&tracker.mutex_);
28 if (tracker.in_a_call_) {
29 return absl::InvalidArgumentError(
"concurrent calls are forbidden");
31 tracker.in_a_call_ =
true;
37 if (tracker_ ==
nullptr) {
41 const absl::MutexLock lock(&tracker_->mutex_);
42 DCHECK(tracker_->in_a_call_);
43 tracker_->in_a_call_ =
false;
static absl::StatusOr< ConcurrentCallsGuard > TryAcquire(Tracker &tracker)