Avi Drissman | e4622aa | 2022-09-08 20:36:06 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors |
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 2 | // 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 | |||||
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 7 | #include <utility> |
8 | |||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 9 | #include "base/atomic_ref_count.h" |
Avi Drissman | 63e1f99 | 2023-01-13 18:54:43 | [diff] [blame] | 10 | #include "base/functional/bind.h" |
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 11 | #include "base/memory/ptr_util.h" |
Peter Boström | 5411965 | 2024-11-14 00:16:38 | [diff] [blame] | 12 | #include "base/notreached.h" |
Peter Kasting | 9f9d8e3 | 2021-08-12 01:14:54 | [diff] [blame] | 13 | #include "base/numerics/safe_conversions.h" |
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 14 | |
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 15 | namespace base { |
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 16 | namespace { |
17 | |||||
18 | // Maintains state for a BarrierClosure. | ||||
19 | class BarrierInfo { | ||||
20 | public: | ||||
Peter Kasting | 9f9d8e3 | 2021-08-12 01:14:54 | [diff] [blame] | 21 | BarrierInfo(size_t num_callbacks_left, OnceClosure done_closure); |
Victor Hugo Vianna Silva | a8951a7a | 2022-12-15 15:22:44 | [diff] [blame] | 22 | BarrierInfo(const BarrierInfo&) = delete; |
23 | BarrierInfo& operator=(const BarrierInfo&) = delete; | ||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 24 | void Run(); |
25 | |||||
26 | private: | ||||
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 27 | AtomicRefCount num_callbacks_left_; |
28 | OnceClosure done_closure_; | ||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 29 | }; |
30 | |||||
Peter Kasting | 9f9d8e3 | 2021-08-12 01:14:54 | [diff] [blame] | 31 | BarrierInfo::BarrierInfo(size_t num_callbacks, OnceClosure done_closure) |
32 | : num_callbacks_left_(checked_cast<int>(num_callbacks)), | ||||
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 33 | done_closure_(std::move(done_closure)) {} |
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 34 | |
35 | void BarrierInfo::Run() { | ||||
Jeremy Roman | ee96d56 | 2017-07-06 19:09:36 | [diff] [blame] | 36 | DCHECK(!num_callbacks_left_.IsZero()); |
Peter Kasting | 134ef9af | 2024-12-28 02:30:09 | [diff] [blame] | 37 | if (!num_callbacks_left_.Decrement()) { |
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 38 | std::move(done_closure_).Run(); |
Peter Kasting | 134ef9af | 2024-12-28 02:30:09 | [diff] [blame] | 39 | } |
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 40 | } |
41 | |||||
cfredric | e7af064 | 2021-07-27 21:06:51 | [diff] [blame] | 42 | void ShouldNeverRun() { |
Peter Boström | 5411965 | 2024-11-14 00:16:38 | [diff] [blame] | 43 | NOTREACHED(); |
cfredric | e7af064 | 2021-07-27 21:06:51 | [diff] [blame] | 44 | } |
45 | |||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 46 | } // namespace |
47 | |||||
Peter Kasting | 9f9d8e3 | 2021-08-12 01:14:54 | [diff] [blame] | 48 | RepeatingClosure BarrierClosure(size_t num_callbacks_left, |
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 49 | OnceClosure done_closure) { |
cfredric | e7af064 | 2021-07-27 21:06:51 | [diff] [blame] | 50 | if (num_callbacks_left == 0) { |
tzik | 34bf605 | 2017-04-27 14:03:21 | [diff] [blame] | 51 | std::move(done_closure).Run(); |
cfredric | e7af064 | 2021-07-27 21:06:51 | [diff] [blame] | 52 | return BindRepeating(&ShouldNeverRun); |
53 | } | ||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 54 | |
cfredric | e7af064 | 2021-07-27 21:06:51 | [diff] [blame] | 55 | return BindRepeating(&BarrierInfo::Run, |
56 | std::make_unique<BarrierInfo>(num_callbacks_left, | ||||
57 | std::move(done_closure))); | ||||
[email protected] | 285d06fc | 2013-08-24 15:00:33 | [diff] [blame] | 58 | } |
59 | |||||
[email protected] | d5b04b83 | 2013-09-12 19:48:15 | [diff] [blame] | 60 | } // namespace base |