blocking_counter.cc
Go to the documentation of this file.
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
16 
18 
19 namespace absl {
20 
21 // Return whether int *arg is zero.
22 static bool IsZero(void *arg) {
23  return 0 == *reinterpret_cast<int *>(arg);
24 }
25 
27  MutexLock l(&lock_);
28  count_--;
29  if (count_ < 0) {
31  FATAL,
32  "BlockingCounter::DecrementCount() called too many times. count=%d",
33  count_);
34  }
35  return count_ == 0;
36 }
37 
39  MutexLock l(&this->lock_);
40  ABSL_RAW_CHECK(count_ >= 0, "BlockingCounter underflow");
41 
42  // only one thread may call Wait(). To support more than one thread,
43  // implement a counter num_to_exit, like in the Barrier class.
44  ABSL_RAW_CHECK(num_waiting_ == 0, "multiple threads called Wait()");
45  num_waiting_++;
46 
47  this->lock_.Await(Condition(IsZero, &this->count_));
48 
49  // At this point, We know that all threads executing DecrementCount have
50  // released the lock, and so will not touch this object again.
51  // Therefore, the thread calling this method is free to delete the object
52  // after we return from this method.
53 }
54 
55 } // namespace absl
static bool IsZero(void *arg)
Definition: barrier.cc:23
#define ABSL_RAW_LOG(severity,...)
Definition: raw_logging.h:42
Definition: algorithm.h:29
#define ABSL_RAW_CHECK(condition, message)
Definition: raw_logging.h:57
void * arg
Definition: mutex.cc:292
void Await(const Condition &cond)


abseil_cpp
Author(s):
autogenerated on Mon Feb 28 2022 21:31:17