Skip to content

Commit a47a710

Browse files
committed
feat: refine semaphore
1 parent ad76d0f commit a47a710

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

include/coro/semaphore.hpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ struct counting_semaphore_t {
103103
// Release n permits (default 1)
104104
// Wakes up waiting coroutines if possible
105105
void release(int n = 1) {
106-
waiter_node* nodes_to_resume[32]; // Batch resume for efficiency
107-
int resume_count = 0;
106+
waiter_node* nodes_to_resume = nullptr; // Head of resume list
108107

109108
{
110109
std::lock_guard<MUTEX> lock(mutex_);
@@ -114,13 +113,12 @@ struct counting_semaphore_t {
114113
waiter_node* prev = nullptr;
115114
waiter_node* node = head_;
116115

117-
while (node && resume_count < 32) {
116+
while (node) {
118117
if (counter_ >= node->desired) {
119118
// This waiter can be satisfied
120119
counter_ -= node->desired;
121-
nodes_to_resume[resume_count++] = node;
122120

123-
// Remove from list
121+
// Remove from waiting list
124122
if (prev) {
125123
prev->next = node->next;
126124
} else {
@@ -132,6 +130,11 @@ struct counting_semaphore_t {
132130
}
133131

134132
waiter_node* next = node->next;
133+
134+
// Add to resume list (prepend for O(1))
135+
node->next = nodes_to_resume;
136+
nodes_to_resume = node;
137+
135138
node = next;
136139
} else {
137140
prev = node;
@@ -141,15 +144,17 @@ struct counting_semaphore_t {
141144
}
142145

143146
// Resume all satisfied waiters outside the lock
144-
for (int i = 0; i < resume_count; i++) {
145-
auto* waiter = nodes_to_resume[i];
147+
waiter_node* waiter = nodes_to_resume;
148+
while (waiter) {
149+
waiter_node* next = waiter->next;
146150
if (waiter->exec) {
147151
waiter->exec->dispatch([handle = waiter->handle]() {
148152
handle.resume();
149153
});
150154
} else {
151155
waiter->handle.resume();
152156
}
157+
waiter = next;
153158
}
154159
}
155160

test/coro_channel.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,11 @@ async<void> test_multiple_producers_consumers() {
333333
co_spawn(exec, consumer(1, &consumer1_completed));
334334
co_spawn(exec, consumer(2, &consumer2_completed));
335335

336-
co_await sleep(200ms);
336+
#ifdef CORO_TEST_RUNNER_VERY_SLOW
337+
co_await sleep(300ms);
338+
#else
339+
co_await sleep(100ms);
340+
#endif
337341

338342
LOG("Verify that all coroutines have completed");
339343
ASSERT(producer1_completed);

0 commit comments

Comments
 (0)