2 * Copyright 2016 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <folly/Synchronized.h>
19 #include <folly/fibers/Baton.h>
25 * Fiber-compatible semaphore. Will safely block fibers that wait when no
26 * tokens are available and wake fibers when signalled.
30 explicit Semaphore(size_t tokenCount) : tokens_(tokenCount) {}
32 Semaphore(const Semaphore&) = delete;
33 Semaphore(Semaphore&&) = delete;
34 Semaphore& operator=(const Semaphore&) = delete;
35 Semaphore& operator=(Semaphore&&) = delete;
38 * Release a token in the semaphore. Signal the waiter if necessary.
43 * Wait for capacity in the semaphore.
52 std::atomic<int64_t> tokens_;
53 folly::Synchronized<std::queue<folly::fibers::Baton*>> waitList_;