Skip to content

Commit c4e2ed4

Browse files
committed
Simplify da_remove_unordered()
1 parent e9d6968 commit c4e2ed4

File tree

1 file changed

+12
-18
lines changed

1 file changed

+12
-18
lines changed

coroutine.c

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,11 @@
3030
(da)->items[(da)->count++] = (item); \
3131
} while (0)
3232

33-
#define da_swap(type, da, i, j) \
34-
do { \
35-
type t = (da)->items[(i)]; \
36-
(da)->items[(i)] = (da)->items[(j)]; \
37-
(da)->items[(j)] = t; \
38-
} while(0)
39-
40-
#define da_remove_unordered(type, da, i) \
41-
do { \
42-
da_swap(type, (da), (i), (da)->count-1); \
43-
(da)->count -= 1; \
33+
#define da_remove_unordered(da, i) \
34+
do { \
35+
size_t j = (i); \
36+
assert(j < (da)->count); \
37+
(da)->items[j] = (da)->items[--(da)->count]; \
4438
} while(0)
4539

4640
#define TODO(message) do { fprintf(stderr, "%s:%d: TODO: %s\n", __FILE__, __LINE__, message); abort(); } while(0)
@@ -180,14 +174,14 @@ void coroutine_switch_context(void *rsp, Sleep_Mode sm, int fd)
180174
da_append(&asleep, active.items[current]);
181175
struct pollfd pfd = {.fd = fd, .events = POLLRDNORM,};
182176
da_append(&polls, pfd);
183-
da_remove_unordered(size_t, &active, current);
177+
da_remove_unordered(&active, current);
184178
} break;
185179

186180
case SM_WRITE: {
187181
da_append(&asleep, active.items[current]);
188182
struct pollfd pfd = {.fd = fd, .events = POLLWRNORM,};
189183
da_append(&polls, pfd);
190-
da_remove_unordered(size_t, &active, current);
184+
da_remove_unordered(&active, current);
191185
} break;
192186

193187
default: UNREACHABLE("coroutine_switch_context");
@@ -201,8 +195,8 @@ void coroutine_switch_context(void *rsp, Sleep_Mode sm, int fd)
201195
for (size_t i = 0; i < polls.count;) {
202196
if (polls.items[i].revents) {
203197
size_t id = asleep.items[i];
204-
da_remove_unordered(struct pollfd, &polls, i);
205-
da_remove_unordered(size_t, &asleep, i);
198+
da_remove_unordered(&polls, i);
199+
da_remove_unordered(&asleep, i);
206200
da_append(&active, id);
207201
} else {
208202
++i;
@@ -242,7 +236,7 @@ void coroutine_finish(void)
242236

243237
contexts_.items[active.items[current]].dead = true;
244238
da_append(&dead, active.items[current]);
245-
da_remove_unordered(size_t, &active, current);
239+
da_remove_unordered(&active, current);
246240

247241
if (polls.count > 0) {
248242
int timeout = active.count == 0 ? -1 : 0;
@@ -252,8 +246,8 @@ void coroutine_finish(void)
252246
for (size_t i = 0; i < polls.count;) {
253247
if (polls.items[i].revents) {
254248
size_t id = asleep.items[i];
255-
da_remove_unordered(struct pollfd, &polls, i);
256-
da_remove_unordered(size_t, &asleep, i);
249+
da_remove_unordered(&polls, i);
250+
da_remove_unordered(&asleep, i);
257251
da_append(&active, id);
258252
} else {
259253
++i;

0 commit comments

Comments
 (0)