@@ -705,13 +705,35 @@ struct flag_update {
705
705
enum lwan_connection_coro_yield request_conn_yield ;
706
706
};
707
707
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
+
708
728
static struct flag_update
709
729
update_flags_for_async_awaitv (struct lwan_request * r , struct lwan * l , va_list ap )
710
730
{
711
731
int epoll_fd = r -> conn -> thread -> epoll_fd ;
712
732
struct flag_update update = {.num_awaiting = 0 ,
713
733
.request_conn_yield = CONN_CORO_YIELD };
714
734
735
+ reset_conn_async_await_multiple_flag (l -> conns , ap );
736
+
715
737
while (true) {
716
738
int await_fd = va_arg (ap , int );
717
739
if (await_fd < 0 ) {
@@ -758,30 +780,11 @@ update_flags_for_async_awaitv(struct lwan_request *r, struct lwan *l, va_list ap
758
780
}
759
781
}
760
782
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
-
776
783
int lwan_request_awaitv_any (struct lwan_request * r , ...)
777
784
{
778
785
struct lwan * l = r -> conn -> thread -> lwan ;
779
786
va_list ap ;
780
787
781
- va_start (ap , r );
782
- reset_conn_async_await_multiple_flag (l -> conns , ap );
783
- va_end (ap );
784
-
785
788
va_start (ap , r );
786
789
struct flag_update update = update_flags_for_async_awaitv (r , l , ap );
787
790
va_end (ap );
@@ -790,13 +793,8 @@ int lwan_request_awaitv_any(struct lwan_request *r, ...)
790
793
int64_t v = coro_yield (r -> conn -> coro , update .request_conn_yield );
791
794
struct lwan_connection * conn = (struct lwan_connection * )(uintptr_t )v ;
792
795
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 )
798
797
return lwan_connection_get_fd (l , conn );
799
- }
800
798
}
801
799
}
802
800
@@ -805,10 +803,6 @@ void lwan_request_awaitv_all(struct lwan_request *r, ...)
805
803
struct lwan * l = r -> conn -> thread -> lwan ;
806
804
va_list ap ;
807
805
808
- va_start (ap , r );
809
- reset_conn_async_await_multiple_flag (l -> conns , ap );
810
- va_end (ap );
811
-
812
806
va_start (ap , r );
813
807
struct flag_update update = update_flags_for_async_awaitv (r , l , ap );
814
808
va_end (ap );
0 commit comments