This is an automated email from the ASF dual-hosted git repository.
wwbmmm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git
The following commit(s) were added to refs/heads/master by this push:
new 77431a34 Reduce futex usage in ParkingLot (#2907)
77431a34 is described below
commit 77431a345aad992c4a748817d85c84aae38c416c
Author: Jim Lin <[email protected]>
AuthorDate: Thu Mar 6 19:26:21 2025 +0800
Reduce futex usage in ParkingLot (#2907)
---
src/bthread/parking_lot.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/bthread/parking_lot.h b/src/bthread/parking_lot.h
index d42a560e..d597c409 100644
--- a/src/bthread/parking_lot.h
+++ b/src/bthread/parking_lot.h
@@ -40,11 +40,14 @@ public:
int val;
};
- ParkingLot() : _pending_signal(0) {}
+ ParkingLot() : _pending_signal(0), _waiter_num(0) {}
// Wake up at most `num_task' workers.
// Returns #workers woken up.
int signal(int num_task) {
+ if (_waiter_num.load(butil::memory_order_relaxed) == 0) {
+ return 0;
+ }
_pending_signal.fetch_add((num_task << 1),
butil::memory_order_release);
return futex_wake_private(&_pending_signal, num_task);
}
@@ -57,7 +60,9 @@ public:
// Wait for tasks.
// If the `expected_state' does not match, wait() may finish directly.
void wait(const State& expected_state) {
+ _waiter_num.fetch_add(1, butil::memory_order_relaxed);
futex_wait_private(&_pending_signal, expected_state.val, NULL);
+ _waiter_num.fetch_sub(1, butil::memory_order_relaxed);
}
// Wakeup suspended wait() and make them unwaitable ever.
@@ -68,6 +73,7 @@ public:
private:
// higher 31 bits for signalling, LSB for stopping.
butil::atomic<int> _pending_signal;
+ butil::atomic<int> _waiter_num;
};
} // namespace bthread
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]