Skip to content

Commit 92b4ec7

Browse files
committed
Simplify update_flags_for_async_awaitv()
Move call to reset_conn_async_await_multiple_flag() to the mentioned function, so that the awaitv_all() and awaitv_any() functions don't need to do it themselves. Also, no need to clear the flag in the awaitv_any() case when returning from coro_yield().
1 parent b530ed6 commit 92b4ec7

File tree

1 file changed

+23
-29
lines changed

1 file changed

+23
-29
lines changed

src/lib/lwan-thread.c

+23-29
Original file line numberDiff line numberDiff line change
@@ -705,13 +705,35 @@ struct flag_update {
705705
enum lwan_connection_coro_yield request_conn_yield;
706706
};
707707

708+
static void reset_conn_async_await_multiple_flag(struct lwan_connection *conns,
709+
va_list ap_orig)
710+
{
711+
va_list ap;
712+
713+
va_copy(ap, ap_orig);
714+
715+
while (true) {
716+
int await_fd = va_arg(ap, int);
717+
if (await_fd < 0) {
718+
va_end(ap);
719+
break;
720+
}
721+
722+
conns[await_fd].flags &= ~CONN_ASYNC_AWAIT_MULTIPLE;
723+
724+
LWAN_NO_DISCARD(va_arg(ap, enum lwan_connection_coro_yield));
725+
}
726+
}
727+
708728
static struct flag_update
709729
update_flags_for_async_awaitv(struct lwan_request *r, struct lwan *l, va_list ap)
710730
{
711731
int epoll_fd = r->conn->thread->epoll_fd;
712732
struct flag_update update = {.num_awaiting = 0,
713733
.request_conn_yield = CONN_CORO_YIELD};
714734

735+
reset_conn_async_await_multiple_flag(l->conns, ap);
736+
715737
while (true) {
716738
int await_fd = va_arg(ap, int);
717739
if (await_fd < 0) {
@@ -758,30 +780,11 @@ update_flags_for_async_awaitv(struct lwan_request *r, struct lwan *l, va_list ap
758780
}
759781
}
760782

761-
static void reset_conn_async_await_multiple_flag(struct lwan_connection *conns,
762-
va_list ap)
763-
{
764-
while (true) {
765-
int await_fd = va_arg(ap, int);
766-
if (await_fd < 0)
767-
return;
768-
769-
struct lwan_connection *conn = &conns[await_fd];
770-
conn->flags &= ~CONN_ASYNC_AWAIT_MULTIPLE;
771-
772-
LWAN_NO_DISCARD(va_arg(ap, enum lwan_connection_coro_yield));
773-
}
774-
}
775-
776783
int lwan_request_awaitv_any(struct lwan_request *r, ...)
777784
{
778785
struct lwan *l = r->conn->thread->lwan;
779786
va_list ap;
780787

781-
va_start(ap, r);
782-
reset_conn_async_await_multiple_flag(l->conns, ap);
783-
va_end(ap);
784-
785788
va_start(ap, r);
786789
struct flag_update update = update_flags_for_async_awaitv(r, l, ap);
787790
va_end(ap);
@@ -790,13 +793,8 @@ int lwan_request_awaitv_any(struct lwan_request *r, ...)
790793
int64_t v = coro_yield(r->conn->coro, update.request_conn_yield);
791794
struct lwan_connection *conn = (struct lwan_connection *)(uintptr_t)v;
792795

793-
if (conn->flags & CONN_ASYNC_AWAIT_MULTIPLE) {
794-
va_start(ap, r);
795-
reset_conn_async_await_multiple_flag(l->conns, ap);
796-
va_end(ap);
797-
796+
if (conn->flags & CONN_ASYNC_AWAIT_MULTIPLE)
798797
return lwan_connection_get_fd(l, conn);
799-
}
800798
}
801799
}
802800

@@ -805,10 +803,6 @@ void lwan_request_awaitv_all(struct lwan_request *r, ...)
805803
struct lwan *l = r->conn->thread->lwan;
806804
va_list ap;
807805

808-
va_start(ap, r);
809-
reset_conn_async_await_multiple_flag(l->conns, ap);
810-
va_end(ap);
811-
812806
va_start(ap, r);
813807
struct flag_update update = update_flags_for_async_awaitv(r, l, ap);
814808
va_end(ap);

0 commit comments

Comments
 (0)