Skip to content

Commit 581b444

Browse files
authored
src: modernize cleanup queue to use c++20
PR-URL: #56063 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent f05d287 commit 581b444

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

src/cleanup_queue-inl.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
55

6+
#include <compare>
7+
68
#include "cleanup_queue.h"
79
#include "util.h"
810

@@ -29,6 +31,18 @@ void CleanupQueue::Remove(Callback cb, void* arg) {
2931
cleanup_hooks_.erase(search);
3032
}
3133

34+
constexpr std::strong_ordering CleanupQueue::CleanupHookCallback::operator<=>(
35+
const CleanupHookCallback& other) const noexcept {
36+
if (insertion_order_counter_ > other.insertion_order_counter_) {
37+
return std::strong_ordering::greater;
38+
}
39+
40+
if (insertion_order_counter_ < other.insertion_order_counter_) {
41+
return std::strong_ordering::less;
42+
}
43+
return std::strong_ordering::equivalent;
44+
}
45+
3246
} // namespace node
3347

3448
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS

src/cleanup_queue.cc

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "cleanup_queue.h" // NOLINT(build/include_inline)
22
#include <algorithm>
3+
#include <ranges>
34
#include <vector>
45
#include "cleanup_queue-inl.h"
56

@@ -8,27 +9,20 @@ namespace node {
89
std::vector<CleanupQueue::CleanupHookCallback> CleanupQueue::GetOrdered()
910
const {
1011
// Copy into a vector, since we can't sort an unordered_set in-place.
11-
std::vector<CleanupHookCallback> callbacks(cleanup_hooks_.begin(),
12-
cleanup_hooks_.end());
12+
std::vector callbacks(cleanup_hooks_.begin(), cleanup_hooks_.end());
1313
// We can't erase the copied elements from `cleanup_hooks_` yet, because we
1414
// need to be able to check whether they were un-scheduled by another hook.
1515

16-
std::sort(callbacks.begin(),
17-
callbacks.end(),
18-
[](const CleanupHookCallback& a, const CleanupHookCallback& b) {
19-
// Sort in descending order so that the most recently inserted
20-
// callbacks are run first.
21-
return a.insertion_order_counter_ > b.insertion_order_counter_;
22-
});
16+
// Sort in descending order so that the most recently inserted callbacks are
17+
// run first.
18+
std::ranges::sort(callbacks, std::greater());
2319

2420
return callbacks;
2521
}
2622

2723
void CleanupQueue::Drain() {
28-
std::vector<CleanupHookCallback> callbacks = GetOrdered();
29-
30-
for (const CleanupHookCallback& cb : callbacks) {
31-
if (cleanup_hooks_.count(cb) == 0) {
24+
for (const CleanupHookCallback& cb : GetOrdered()) {
25+
if (!cleanup_hooks_.contains(cb)) {
3226
// This hook was removed from the `cleanup_hooks_` set during another
3327
// hook that was run earlier. Nothing to do here.
3428
continue;

src/cleanup_queue.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
55

6+
#include <compare>
67
#include <cstddef>
78
#include <cstdint>
89
#include <unordered_set>
@@ -41,6 +42,9 @@ class CleanupQueue : public MemoryRetainer {
4142
arg_(arg),
4243
insertion_order_counter_(insertion_order_counter) {}
4344

45+
constexpr std::strong_ordering operator<=>(
46+
const CleanupHookCallback& other) const noexcept;
47+
4448
// Only hashes `arg_`, since that is usually enough to identify the hook.
4549
struct Hash {
4650
size_t operator()(const CleanupHookCallback& cb) const;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy