blob: 43f0f9ebcd1cf422314a41aa23bb1dd60ff45eb4 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2013 The Chromium Authors
[email protected]285d06fc2013-08-24 15:00:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/barrier_closure.h"
6
tzik34bf6052017-04-27 14:03:217#include <utility>
8
[email protected]285d06fc2013-08-24 15:00:339#include "base/atomic_ref_count.h"
Avi Drissman63e1f992023-01-13 18:54:4310#include "base/functional/bind.h"
tzik34bf6052017-04-27 14:03:2111#include "base/memory/ptr_util.h"
Peter Boström54119652024-11-14 00:16:3812#include "base/notreached.h"
Peter Kasting9f9d8e32021-08-12 01:14:5413#include "base/numerics/safe_conversions.h"
[email protected]285d06fc2013-08-24 15:00:3314
tzik34bf6052017-04-27 14:03:2115namespace base {
[email protected]285d06fc2013-08-24 15:00:3316namespace {
17
18// Maintains state for a BarrierClosure.
19class BarrierInfo {
20 public:
Peter Kasting9f9d8e32021-08-12 01:14:5421 BarrierInfo(size_t num_callbacks_left, OnceClosure done_closure);
Victor Hugo Vianna Silvaa8951a7a2022-12-15 15:22:4422 BarrierInfo(const BarrierInfo&) = delete;
23 BarrierInfo& operator=(const BarrierInfo&) = delete;
[email protected]285d06fc2013-08-24 15:00:3324 void Run();
25
26 private:
tzik34bf6052017-04-27 14:03:2127 AtomicRefCount num_callbacks_left_;
28 OnceClosure done_closure_;
[email protected]285d06fc2013-08-24 15:00:3329};
30
Peter Kasting9f9d8e32021-08-12 01:14:5431BarrierInfo::BarrierInfo(size_t num_callbacks, OnceClosure done_closure)
32 : num_callbacks_left_(checked_cast<int>(num_callbacks)),
tzik34bf6052017-04-27 14:03:2133 done_closure_(std::move(done_closure)) {}
[email protected]285d06fc2013-08-24 15:00:3334
35void BarrierInfo::Run() {
Jeremy Romanee96d562017-07-06 19:09:3636 DCHECK(!num_callbacks_left_.IsZero());
Peter Kasting134ef9af2024-12-28 02:30:0937 if (!num_callbacks_left_.Decrement()) {
tzik34bf6052017-04-27 14:03:2138 std::move(done_closure_).Run();
Peter Kasting134ef9af2024-12-28 02:30:0939 }
[email protected]285d06fc2013-08-24 15:00:3340}
41
cfredrice7af0642021-07-27 21:06:5142void ShouldNeverRun() {
Peter Boström54119652024-11-14 00:16:3843 NOTREACHED();
cfredrice7af0642021-07-27 21:06:5144}
45
[email protected]285d06fc2013-08-24 15:00:3346} // namespace
47
Peter Kasting9f9d8e32021-08-12 01:14:5448RepeatingClosure BarrierClosure(size_t num_callbacks_left,
tzik34bf6052017-04-27 14:03:2149 OnceClosure done_closure) {
cfredrice7af0642021-07-27 21:06:5150 if (num_callbacks_left == 0) {
tzik34bf6052017-04-27 14:03:2151 std::move(done_closure).Run();
cfredrice7af0642021-07-27 21:06:5152 return BindRepeating(&ShouldNeverRun);
53 }
[email protected]285d06fc2013-08-24 15:00:3354
cfredrice7af0642021-07-27 21:06:5155 return BindRepeating(&BarrierInfo::Run,
56 std::make_unique<BarrierInfo>(num_callbacks_left,
57 std::move(done_closure)));
[email protected]285d06fc2013-08-24 15:00:3358}
59
[email protected]d5b04b832013-09-12 19:48:1560} // namespace base