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)