@fails-components/webtransport 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/readme.md +1 -3
- package/src/http3eventloop.cc +83 -9
- package/src/http3eventloop.h +13 -3
- package/src/http3server.cc +22 -22
- package/src/http3server.h +7 -20
- package/src/http3wtstreamvisitor.cc +31 -10
- package/src/http3wtstreamvisitor.h +38 -11
- package/src/webtransport.js +91 -23
- package/test/echoserver.js +29 -5
- package/test/testsuite.js +242 -220
- package/third_party/boringssl/src/CMakeLists.txt +2 -0
- package/third_party/boringssl/src/crypto/CMakeLists.txt +1 -0
- package/third_party/boringssl/src/crypto/asn1/a_bitstr.c +174 -177
- package/third_party/boringssl/src/crypto/asn1/a_bool.c +46 -48
- package/third_party/boringssl/src/crypto/asn1/a_d2i_fp.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_dup.c +21 -23
- package/third_party/boringssl/src/crypto/asn1/a_gentm.c +84 -187
- package/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c +19 -21
- package/third_party/boringssl/src/crypto/asn1/a_int.c +305 -329
- package/third_party/boringssl/src/crypto/asn1/a_mbstr.c +190 -195
- package/third_party/boringssl/src/crypto/asn1/a_object.c +182 -189
- package/third_party/boringssl/src/crypto/asn1/a_octet.c +6 -9
- package/third_party/boringssl/src/crypto/asn1/a_print.c +15 -16
- package/third_party/boringssl/src/crypto/asn1/a_strex.c +386 -399
- package/third_party/boringssl/src/crypto/asn1/a_strnid.c +110 -131
- package/third_party/boringssl/src/crypto/asn1/a_time.c +118 -111
- package/third_party/boringssl/src/crypto/asn1/a_type.c +59 -60
- package/third_party/boringssl/src/crypto/asn1/a_utctm.c +114 -186
- package/third_party/boringssl/src/crypto/asn1/a_utf8.c +171 -159
- package/third_party/boringssl/src/crypto/asn1/asn1_lib.c +245 -260
- package/third_party/boringssl/src/crypto/asn1/asn1_par.c +41 -40
- package/third_party/boringssl/src/crypto/asn1/asn1_test.cc +31 -0
- package/third_party/boringssl/src/crypto/asn1/asn_pack.c +31 -33
- package/third_party/boringssl/src/crypto/asn1/f_int.c +36 -33
- package/third_party/boringssl/src/crypto/asn1/f_string.c +29 -26
- package/third_party/boringssl/src/crypto/asn1/internal.h +62 -61
- package/third_party/boringssl/src/crypto/asn1/tasn_dec.c +706 -702
- package/third_party/boringssl/src/crypto/asn1/tasn_enc.c +507 -524
- package/third_party/boringssl/src/crypto/asn1/tasn_fre.c +141 -133
- package/third_party/boringssl/src/crypto/asn1/tasn_new.c +207 -199
- package/third_party/boringssl/src/crypto/asn1/tasn_typ.c +19 -22
- package/third_party/boringssl/src/crypto/asn1/tasn_utl.c +24 -24
- package/third_party/boringssl/src/crypto/asn1/time_support.c +13 -13
- package/third_party/boringssl/src/crypto/bio/connect.c +9 -3
- package/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc +125 -1
- package/third_party/boringssl/src/crypto/bytestring/cbb.c +4 -7
- package/third_party/boringssl/src/crypto/bytestring/cbs.c +167 -9
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c +23 -54
- package/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c +0 -2
- package/third_party/boringssl/src/crypto/cipher_extra/e_tls.c +0 -2
- package/third_party/boringssl/src/crypto/curve25519/curve25519.c +6 -8
- package/third_party/boringssl/src/crypto/evp/evp_ctx.c +25 -22
- package/third_party/boringssl/src/crypto/evp/internal.h +15 -9
- package/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ec_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_ed25519.c +3 -3
- package/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c +10 -7
- package/third_party/boringssl/src/crypto/evp/p_hkdf.c +241 -0
- package/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c +2 -0
- package/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/aes/aes_nohw.c +9 -10
- package/third_party/boringssl/src/crypto/fipsmodule/aes/key_wrap.c +2 -6
- package/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c +5 -11
- package/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +1 -1
- package/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c +2 -0
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +10 -26
- package/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aesccm.c +2 -3
- package/third_party/boringssl/src/crypto/fipsmodule/digestsign/digestsign.c +1 -0
- package/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +44 -43
- package/third_party/boringssl/src/crypto/fipsmodule/modes/cbc.c +5 -9
- package/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c +14 -21
- package/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg.c +8 -8
- package/third_party/boringssl/src/crypto/fipsmodule/rand/internal.h +1 -4
- package/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc +104 -0
- package/third_party/boringssl/src/crypto/internal.h +18 -4
- package/third_party/boringssl/src/crypto/lhash/internal.h +13 -1
- package/third_party/boringssl/src/crypto/obj/obj_dat.h +4 -1
- package/third_party/boringssl/src/crypto/obj/obj_mac.num +1 -0
- package/third_party/boringssl/src/crypto/obj/objects.txt +2 -0
- package/third_party/boringssl/src/crypto/pem/pem_all.c +77 -86
- package/third_party/boringssl/src/crypto/pem/pem_info.c +221 -233
- package/third_party/boringssl/src/crypto/pem/pem_lib.c +639 -608
- package/third_party/boringssl/src/crypto/pem/pem_oth.c +17 -16
- package/third_party/boringssl/src/crypto/pem/pem_pk8.c +133 -142
- package/third_party/boringssl/src/crypto/pem/pem_pkey.c +96 -92
- package/third_party/boringssl/src/crypto/poly1305/poly1305_vec.c +12 -28
- package/third_party/boringssl/src/crypto/siphash/siphash.c +8 -11
- package/third_party/boringssl/src/crypto/siphash/siphash_test.cc +5 -7
- package/third_party/boringssl/src/crypto/stack/stack.c +33 -16
- package/third_party/boringssl/src/crypto/thread_pthread.c +0 -2
- package/third_party/boringssl/src/crypto/thread_win.c +0 -2
- package/third_party/boringssl/src/crypto/trust_token/internal.h +14 -0
- package/third_party/boringssl/src/crypto/trust_token/pmbtoken.c +127 -30
- package/third_party/boringssl/src/crypto/trust_token/trust_token.c +40 -0
- package/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +165 -0
- package/third_party/boringssl/src/crypto/trust_token/voprf.c +55 -6
- package/third_party/boringssl/src/crypto/x509/a_digest.c +23 -24
- package/third_party/boringssl/src/crypto/x509/a_sign.c +52 -55
- package/third_party/boringssl/src/crypto/x509/a_verify.c +33 -34
- package/third_party/boringssl/src/crypto/x509/algorithm.c +17 -18
- package/third_party/boringssl/src/crypto/x509/asn1_gen.c +618 -612
- package/third_party/boringssl/src/crypto/x509/by_dir.c +320 -337
- package/third_party/boringssl/src/crypto/x509/by_file.c +186 -186
- package/third_party/boringssl/src/crypto/x509/i2d_pr.c +11 -14
- package/third_party/boringssl/src/crypto/x509/internal.h +22 -22
- package/third_party/boringssl/src/crypto/x509/name_print.c +155 -150
- package/third_party/boringssl/src/crypto/x509/rsa_pss.c +27 -29
- package/third_party/boringssl/src/crypto/x509/t_crl.c +67 -70
- package/third_party/boringssl/src/crypto/x509/t_req.c +3 -5
- package/third_party/boringssl/src/crypto/x509/t_x509.c +280 -251
- package/third_party/boringssl/src/crypto/x509/t_x509a.c +52 -47
- package/third_party/boringssl/src/crypto/x509/x509.c +3 -4
- package/third_party/boringssl/src/crypto/x509/x509_att.c +234 -223
- package/third_party/boringssl/src/crypto/x509/x509_cmp.c +286 -296
- package/third_party/boringssl/src/crypto/x509/x509_d2.c +37 -32
- package/third_party/boringssl/src/crypto/x509/x509_def.c +14 -30
- package/third_party/boringssl/src/crypto/x509/x509_ext.c +55 -84
- package/third_party/boringssl/src/crypto/x509/x509_lu.c +545 -581
- package/third_party/boringssl/src/crypto/x509/x509_obj.c +131 -121
- package/third_party/boringssl/src/crypto/x509/x509_req.c +120 -139
- package/third_party/boringssl/src/crypto/x509/x509_set.c +128 -142
- package/third_party/boringssl/src/crypto/x509/x509_trs.c +185 -193
- package/third_party/boringssl/src/crypto/x509/x509_txt.c +70 -72
- package/third_party/boringssl/src/crypto/x509/x509_v3.c +172 -161
- package/third_party/boringssl/src/crypto/x509/x509_vfy.c +2041 -2053
- package/third_party/boringssl/src/crypto/x509/x509_vpm.c +441 -461
- package/third_party/boringssl/src/crypto/x509/x509cset.c +152 -170
- package/third_party/boringssl/src/crypto/x509/x509name.c +274 -260
- package/third_party/boringssl/src/crypto/x509/x509rset.c +43 -20
- package/third_party/boringssl/src/crypto/x509/x509spki.c +62 -63
- package/third_party/boringssl/src/crypto/x509/x_algor.c +64 -62
- package/third_party/boringssl/src/crypto/x509/x_all.c +103 -133
- package/third_party/boringssl/src/crypto/x509/x_attrib.c +23 -24
- package/third_party/boringssl/src/crypto/x509/x_crl.c +310 -321
- package/third_party/boringssl/src/crypto/x509/x_exten.c +6 -5
- package/third_party/boringssl/src/crypto/x509/x_info.c +31 -28
- package/third_party/boringssl/src/crypto/x509/x_name.c +361 -365
- package/third_party/boringssl/src/crypto/x509/x_pkey.c +38 -32
- package/third_party/boringssl/src/crypto/x509/x_pubkey.c +114 -117
- package/third_party/boringssl/src/crypto/x509/x_req.c +27 -29
- package/third_party/boringssl/src/crypto/x509/x_sig.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_spki.c +8 -10
- package/third_party/boringssl/src/crypto/x509/x_val.c +2 -2
- package/third_party/boringssl/src/crypto/x509/x_x509.c +212 -226
- package/third_party/boringssl/src/crypto/x509/x_x509a.c +112 -109
- package/third_party/boringssl/src/crypto/x509v3/ext_dat.h +10 -13
- package/third_party/boringssl/src/crypto/x509v3/internal.h +72 -87
- package/third_party/boringssl/src/crypto/x509v3/pcy_cache.c +184 -176
- package/third_party/boringssl/src/crypto/x509v3/pcy_data.c +58 -56
- package/third_party/boringssl/src/crypto/x509v3/pcy_lib.c +71 -70
- package/third_party/boringssl/src/crypto/x509v3/pcy_map.c +56 -58
- package/third_party/boringssl/src/crypto/x509v3/pcy_node.c +89 -91
- package/third_party/boringssl/src/crypto/x509v3/pcy_tree.c +585 -590
- package/third_party/boringssl/src/crypto/x509v3/v3_akey.c +118 -112
- package/third_party/boringssl/src/crypto/x509v3/v3_akeya.c +3 -3
- package/third_party/boringssl/src/crypto/x509v3/v3_alt.c +447 -451
- package/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +44 -38
- package/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +39 -43
- package/third_party/boringssl/src/crypto/x509v3/v3_conf.c +321 -320
- package/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +352 -327
- package/third_party/boringssl/src/crypto/x509v3/v3_crld.c +437 -383
- package/third_party/boringssl/src/crypto/x509v3/v3_enum.c +23 -16
- package/third_party/boringssl/src/crypto/x509v3/v3_extku.c +62 -53
- package/third_party/boringssl/src/crypto/x509v3/v3_genn.c +118 -115
- package/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +30 -31
- package/third_party/boringssl/src/crypto/x509v3/v3_info.c +112 -98
- package/third_party/boringssl/src/crypto/x509v3/v3_int.c +40 -15
- package/third_party/boringssl/src/crypto/x509v3/v3_lib.c +248 -252
- package/third_party/boringssl/src/crypto/x509v3/v3_ncons.c +390 -386
- package/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c +45 -32
- package/third_party/boringssl/src/crypto/x509v3/v3_pci.c +206 -209
- package/third_party/boringssl/src/crypto/x509v3/v3_pcia.c +6 -8
- package/third_party/boringssl/src/crypto/x509v3/v3_pcons.c +54 -50
- package/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c +66 -65
- package/third_party/boringssl/src/crypto/x509v3/v3_prn.c +144 -133
- package/third_party/boringssl/src/crypto/x509v3/v3_purp.c +695 -709
- package/third_party/boringssl/src/crypto/x509v3/v3_skey.c +75 -69
- package/third_party/boringssl/src/crypto/x509v3/v3_utl.c +1102 -1082
- package/third_party/boringssl/src/include/openssl/base.h +3 -1
- package/third_party/boringssl/src/include/openssl/bn.h +3 -0
- package/third_party/boringssl/src/include/openssl/bytestring.h +20 -0
- package/third_party/boringssl/src/include/openssl/evp.h +6 -5
- package/third_party/boringssl/src/include/openssl/kdf.h +91 -0
- package/third_party/boringssl/src/include/openssl/nid.h +4 -0
- package/third_party/boringssl/src/include/openssl/ssl.h +6 -1
- package/third_party/boringssl/src/include/openssl/stack.h +47 -32
- package/third_party/boringssl/src/include/openssl/trust_token.h +18 -3
- package/third_party/boringssl/src/include/openssl/x509.h +18 -0
- package/third_party/boringssl/src/ssl/ssl_file.cc +61 -99
- package/third_party/boringssl/src/ssl/ssl_test.cc +101 -0
- package/third_party/boringssl/src/util/doc.config +2 -1
- package/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go +8 -0
- package/third_party/googleurl/AUTHORS +16 -2
- package/third_party/googleurl/base/BUILD +1 -0
- package/third_party/googleurl/base/compiler_specific.h +16 -17
- package/third_party/googleurl/base/containers/contiguous_iterator.h +13 -9
- package/third_party/googleurl/base/containers/span.h +23 -8
- package/third_party/googleurl/base/memory/raw_ptr.h +17 -25
- package/third_party/googleurl/base/memory/raw_ptr_exclusion.h +21 -0
- package/third_party/googleurl/base/strings/escape.cc +14 -2
- package/third_party/googleurl/base/strings/safe_sprintf.h +1 -1
- package/third_party/googleurl/base/strings/string_number_conversions.cc +5 -3
- package/third_party/googleurl/base/strings/string_number_conversions_internal.h +5 -5
- package/third_party/googleurl/base/strings/string_piece.h +3 -3
- package/third_party/googleurl/base/strings/string_util.cc +4 -27
- package/third_party/googleurl/base/strings/string_util.h +43 -8
- package/third_party/googleurl/base/strings/string_util_internal.h +11 -12
- package/third_party/googleurl/base/strings/string_util_unittest.cc +33 -0
- package/third_party/googleurl/base/strings/string_util_win.cc +0 -5
- package/third_party/googleurl/base/strings/string_util_win.h +9 -1
- package/third_party/googleurl/base/strings/utf_offset_string_conversions.cc +1 -1
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.cc +5 -8
- package/third_party/googleurl/base/strings/utf_string_conversion_utils.h +13 -10
- package/third_party/googleurl/base/strings/utf_string_conversions.cc +32 -25
- package/third_party/googleurl/base/template_util.h +23 -35
- package/third_party/googleurl/build/build_config.h +14 -3
- package/third_party/googleurl/copy.bara.sky +1 -1
- package/third_party/googleurl/url/gurl.cc +8 -4
- package/third_party/googleurl/url/gurl.h +1 -0
- package/third_party/googleurl/url/gurl_unittest.cc +1 -0
- package/third_party/googleurl/url/origin.h +36 -26
- package/third_party/googleurl/url/scheme_host_port.h +4 -1
- package/third_party/googleurl/url/url_canon.h +2 -1
- package/third_party/googleurl/url/url_canon_internal.cc +9 -7
- package/third_party/googleurl/url/url_canon_internal.h +16 -16
- package/third_party/googleurl/url/url_canon_stdstring.h +2 -1
- package/third_party/googleurl/url/url_util.cc +9 -8
- package/third_party/quiche/build/source_list.bzl +7 -0
- package/third_party/quiche/build/source_list.gni +7 -0
- package/third_party/quiche/build/source_list.json +7 -0
- package/third_party/quiche/quiche/common/platform/api/quiche_mem_slice.h +7 -3
- package/third_party/quiche/quiche/http2/adapter/nghttp2_adapter_test.cc +86 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_adapter_test.cc +104 -2
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.cc +23 -0
- package/third_party/quiche/quiche/http2/adapter/oghttp2_session.h +6 -1
- package/third_party/quiche/quiche/quic/core/congestion_control/send_algorithm_test.cc +0 -16
- package/third_party/quiche/quiche/quic/core/crypto/crypto_protocol.h +1 -1
- package/third_party/quiche/quiche/quic/core/http/end_to_end_test.cc +56 -2
- package/third_party/quiche/quiche/quic/core/http/http_constants.cc +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_constants.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder.cc +28 -17
- package/third_party/quiche/quiche/quic/core/http/http_encoder.h +5 -0
- package/third_party/quiche/quiche/quic/core/http/http_encoder_test.cc +26 -30
- package/third_party/quiche/quiche/quic/core/http/http_frames.h +1 -0
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base.cc +4 -4
- package/third_party/quiche/quiche/quic/core/http/quic_server_session_base_test.cc +1 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_client_session.cc +5 -1
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.cc +6 -33
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream.h +0 -17
- package/third_party/quiche/quiche/quic/core/http/quic_spdy_stream_test.cc +5 -20
- package/third_party/quiche/quiche/quic/core/io/quic_event_loop.h +81 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.cc +265 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop.h +152 -0
- package/third_party/quiche/quiche/quic/core/io/quic_poll_event_loop_test.cc +341 -0
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store.h +7 -7
- package/third_party/quiche/quiche/quic/core/quic_buffered_packet_store_test.cc +4 -3
- package/third_party/quiche/quiche/quic/core/quic_connection.cc +69 -19
- package/third_party/quiche/quiche/quic/core/quic_connection.h +9 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.cc +29 -10
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager.h +5 -3
- package/third_party/quiche/quiche/quic/core/quic_connection_id_manager_test.cc +85 -22
- package/third_party/quiche/quiche/quic/core/quic_connection_test.cc +186 -30
- package/third_party/quiche/quiche/quic/core/quic_crypto_stream.cc +2 -1
- package/third_party/quiche/quiche/quic/core/quic_default_clock.cc +31 -0
- package/third_party/quiche/quiche/quic/core/quic_default_clock.h +34 -0
- package/third_party/quiche/quiche/quic/core/quic_default_connection_helper.h +49 -0
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.cc +53 -37
- package/third_party/quiche/quiche/quic/core/quic_dispatcher.h +19 -11
- package/third_party/quiche/quiche/quic/core/quic_dispatcher_test.cc +15 -2
- package/third_party/quiche/quiche/quic/core/quic_flags_list.h +10 -4
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector.cc +2 -2
- package/third_party/quiche/quiche/quic/core/quic_idle_network_detector_test.cc +4 -4
- package/third_party/quiche/quiche/quic/core/quic_packet_creator.cc +14 -3
- package/third_party/quiche/quiche/quic/core/quic_packet_creator_test.cc +145 -2
- package/third_party/quiche/quiche/quic/core/quic_packets.cc +3 -1
- package/third_party/quiche/quiche/quic/core/quic_packets.h +4 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.cc +13 -11
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager.h +9 -0
- package/third_party/quiche/quiche/quic/core/quic_sent_packet_manager_test.cc +6 -0
- package/third_party/quiche/quiche/quic/core/quic_session.cc +3 -2
- package/third_party/quiche/quiche/quic/core/quic_session.h +8 -3
- package/third_party/quiche/quiche/quic/core/quic_types.cc +18 -0
- package/third_party/quiche/quiche/quic/core/quic_types.h +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.cc +3 -0
- package/third_party/quiche/quiche/quic/core/tls_chlo_extractor.h +10 -0
- package/third_party/quiche/quiche/quic/test_tools/mock_quic_session_visitor.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/quic_test_utils.h +1 -1
- package/third_party/quiche/quiche/quic/test_tools/server_thread.cc +3 -2
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.cc +7 -1
- package/third_party/quiche/quiche/quic/test_tools/simple_session_notifier.h +3 -0
- package/third_party/quiche/quiche/quic/test_tools/simulator/quic_endpoint.h +4 -2
- package/certs/ca.cnf +0 -69
- package/certs/generate_certs.sh +0 -53
- package/certs/generate_certs_leaf.sh +0 -53
- package/certs/leaf.cnf +0 -24
- package/certs/readme.txt +0 -2
- package/third_party/quiche/build/BUILD.bazel +0 -7
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// Copyright 2022 The Chromium Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
#include "quiche/quic/core/io/quic_poll_event_loop.h"
|
|
6
|
+
|
|
7
|
+
#include <poll.h>
|
|
8
|
+
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <cerrno>
|
|
11
|
+
#include <memory>
|
|
12
|
+
|
|
13
|
+
#include "absl/types/span.h"
|
|
14
|
+
#include "quiche/quic/core/io/quic_event_loop.h"
|
|
15
|
+
#include "quiche/quic/core/quic_alarm.h"
|
|
16
|
+
#include "quiche/quic/core/quic_time.h"
|
|
17
|
+
#include "quiche/quic/platform/api/quic_bug_tracker.h"
|
|
18
|
+
|
|
19
|
+
namespace quic {
|
|
20
|
+
|
|
21
|
+
namespace {
|
|
22
|
+
|
|
23
|
+
using PollMask = decltype(::pollfd().events);
|
|
24
|
+
|
|
25
|
+
PollMask GetPollMask(QuicSocketEventMask event_mask) {
|
|
26
|
+
return ((event_mask & kSocketEventReadable) ? POLLIN : 0) |
|
|
27
|
+
((event_mask & kSocketEventWritable) ? POLLOUT : 0) |
|
|
28
|
+
((event_mask & kSocketEventError) ? POLLERR : 0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
QuicSocketEventMask GetEventMask(PollMask poll_mask) {
|
|
32
|
+
return ((poll_mask & POLLIN) ? kSocketEventReadable : 0) |
|
|
33
|
+
((poll_mask & POLLOUT) ? kSocketEventWritable : 0) |
|
|
34
|
+
((poll_mask & POLLERR) ? kSocketEventError : 0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
} // namespace
|
|
38
|
+
|
|
39
|
+
QuicPollEventLoop::QuicPollEventLoop(QuicClock* clock)
|
|
40
|
+
: clock_(clock), alarm_factory_(this) {}
|
|
41
|
+
|
|
42
|
+
bool QuicPollEventLoop::RegisterSocket(QuicUdpSocketFd fd,
|
|
43
|
+
QuicSocketEventMask events,
|
|
44
|
+
QuicSocketEventListener* listener) {
|
|
45
|
+
auto [it, success] =
|
|
46
|
+
registrations_.insert({fd, std::make_shared<Registration>()});
|
|
47
|
+
if (!success) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
Registration& registration = *it->second;
|
|
51
|
+
registration.events = events;
|
|
52
|
+
registration.listener = listener;
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
bool QuicPollEventLoop::UnregisterSocket(QuicUdpSocketFd fd) {
|
|
57
|
+
return registrations_.erase(fd);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
bool QuicPollEventLoop::RearmSocket(QuicUdpSocketFd fd,
|
|
61
|
+
QuicSocketEventMask events) {
|
|
62
|
+
auto it = registrations_.find(fd);
|
|
63
|
+
if (it == registrations_.end()) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
it->second->events |= events;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bool QuicPollEventLoop::ArtificiallyNotifyEvent(QuicUdpSocketFd fd,
|
|
71
|
+
QuicSocketEventMask events) {
|
|
72
|
+
auto it = registrations_.find(fd);
|
|
73
|
+
if (it == registrations_.end()) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
has_artificial_events_pending_ = true;
|
|
77
|
+
it->second->artificially_notify_at_next_iteration |= events;
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
void QuicPollEventLoop::RunEventLoopOnce(QuicTime::Delta default_timeout) {
|
|
82
|
+
const QuicTime start_time = clock_->Now();
|
|
83
|
+
ProcessAlarmsUpTo(start_time);
|
|
84
|
+
|
|
85
|
+
QuicTime::Delta timeout = ComputePollTimeout(start_time, default_timeout);
|
|
86
|
+
ProcessIoEvents(start_time, timeout);
|
|
87
|
+
|
|
88
|
+
const QuicTime end_time = clock_->Now();
|
|
89
|
+
ProcessAlarmsUpTo(end_time);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
QuicTime::Delta QuicPollEventLoop::ComputePollTimeout(
|
|
93
|
+
QuicTime now, QuicTime::Delta default_timeout) const {
|
|
94
|
+
if (has_artificial_events_pending_) {
|
|
95
|
+
return QuicTime::Delta::Zero();
|
|
96
|
+
}
|
|
97
|
+
if (alarms_.empty()) {
|
|
98
|
+
return default_timeout;
|
|
99
|
+
}
|
|
100
|
+
QuicTime end_time = std::min(now + default_timeout, alarms_.begin()->first);
|
|
101
|
+
if (end_time <= now) {
|
|
102
|
+
// Since we call ProcessAlarmsUpTo() right before this, this should never
|
|
103
|
+
// happen.
|
|
104
|
+
QUIC_BUG(Newest alarm is in the past)
|
|
105
|
+
<< "now " << now.ToDebuggingValue()
|
|
106
|
+
<< ", end_time: " << end_time.ToDebuggingValue();
|
|
107
|
+
return QuicTime::Delta::Zero();
|
|
108
|
+
}
|
|
109
|
+
return end_time - now;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
int QuicPollEventLoop::PollWithRetries(absl::Span<pollfd> fds,
|
|
113
|
+
QuicTime start_time,
|
|
114
|
+
QuicTime::Delta timeout) {
|
|
115
|
+
const QuicTime timeout_at = start_time + timeout;
|
|
116
|
+
int poll_result;
|
|
117
|
+
for (;;) {
|
|
118
|
+
float timeout_ms = std::ceil(timeout.ToMicroseconds() / 1000.f);
|
|
119
|
+
poll_result =
|
|
120
|
+
PollSyscall(fds.data(), fds.size(), static_cast<int>(timeout_ms));
|
|
121
|
+
|
|
122
|
+
// Retry if EINTR happens.
|
|
123
|
+
bool is_eintr = poll_result < 0 && errno == EINTR;
|
|
124
|
+
if (!is_eintr) {
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
QuicTime now = clock_->Now();
|
|
128
|
+
if (now >= timeout_at) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
timeout = timeout_at - now;
|
|
132
|
+
}
|
|
133
|
+
return poll_result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
void QuicPollEventLoop::ProcessIoEvents(QuicTime start_time,
|
|
137
|
+
QuicTime::Delta timeout) {
|
|
138
|
+
// Set up the pollfd[] array.
|
|
139
|
+
const size_t registration_count = registrations_.size();
|
|
140
|
+
auto pollfds = std::make_unique<pollfd[]>(registration_count);
|
|
141
|
+
size_t i = 0;
|
|
142
|
+
for (auto& [fd, registration] : registrations_) {
|
|
143
|
+
QUICHE_CHECK_LT(
|
|
144
|
+
i, registration_count); // Crash instead of out-of-bounds access.
|
|
145
|
+
pollfds[i].fd = fd;
|
|
146
|
+
pollfds[i].events = GetPollMask(registration->events);
|
|
147
|
+
pollfds[i].revents = 0;
|
|
148
|
+
++i;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Actually run poll(2).
|
|
152
|
+
int poll_result =
|
|
153
|
+
PollWithRetries(absl::Span<pollfd>(pollfds.get(), registration_count),
|
|
154
|
+
start_time, timeout);
|
|
155
|
+
if (poll_result == 0) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Prepare the list of all callbacks to be called, while resetting all events,
|
|
160
|
+
// since we're operating in the level-triggered mode.
|
|
161
|
+
std::vector<ReadyListEntry> ready_list;
|
|
162
|
+
ready_list.reserve(registration_count);
|
|
163
|
+
for (i = 0; i < registration_count; i++) {
|
|
164
|
+
DispatchIoEvent(ready_list, pollfds[i].fd, pollfds[i].revents);
|
|
165
|
+
}
|
|
166
|
+
has_artificial_events_pending_ = false;
|
|
167
|
+
|
|
168
|
+
// Actually call all of the callbacks.
|
|
169
|
+
RunReadyCallbacks(ready_list);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
void QuicPollEventLoop::DispatchIoEvent(std::vector<ReadyListEntry>& ready_list,
|
|
173
|
+
QuicUdpSocketFd fd, PollMask mask) {
|
|
174
|
+
auto it = registrations_.find(fd);
|
|
175
|
+
if (it == registrations_.end()) {
|
|
176
|
+
QUIC_BUG(poll returned an unregistered fd) << fd;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
Registration& registration = *it->second;
|
|
180
|
+
|
|
181
|
+
mask |= GetPollMask(registration.artificially_notify_at_next_iteration);
|
|
182
|
+
registration.artificially_notify_at_next_iteration = QuicSocketEventMask();
|
|
183
|
+
|
|
184
|
+
// poll() always returns certain classes of events even if not requested.
|
|
185
|
+
mask &= GetPollMask(registration.events);
|
|
186
|
+
if (!mask) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
ready_list.push_back(ReadyListEntry{fd, it->second, GetEventMask(mask)});
|
|
191
|
+
registration.events &= ~GetEventMask(mask);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
void QuicPollEventLoop::RunReadyCallbacks(
|
|
195
|
+
std::vector<ReadyListEntry>& ready_list) {
|
|
196
|
+
for (ReadyListEntry& entry : ready_list) {
|
|
197
|
+
std::shared_ptr<Registration> registration = entry.registration.lock();
|
|
198
|
+
if (!registration) {
|
|
199
|
+
// The socket has been unregistered from within one of the callbacks.
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
registration->listener->OnSocketEvent(this, entry.fd, entry.events);
|
|
203
|
+
}
|
|
204
|
+
ready_list.clear();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
void QuicPollEventLoop::ProcessAlarmsUpTo(QuicTime time) {
|
|
208
|
+
// Determine which alarm callbacks needs to be run.
|
|
209
|
+
std::vector<std::weak_ptr<Alarm*>> alarms_to_call;
|
|
210
|
+
while (!alarms_.empty() && alarms_.begin()->first <= time) {
|
|
211
|
+
auto& [deadline, schedule_handle_weak] = *alarms_.begin();
|
|
212
|
+
alarms_to_call.push_back(std::move(schedule_handle_weak));
|
|
213
|
+
alarms_.erase(alarms_.begin());
|
|
214
|
+
}
|
|
215
|
+
// Actually run those callbacks.
|
|
216
|
+
for (std::weak_ptr<Alarm*>& schedule_handle_weak : alarms_to_call) {
|
|
217
|
+
std::shared_ptr<Alarm*> schedule_handle = schedule_handle_weak.lock();
|
|
218
|
+
if (!schedule_handle) {
|
|
219
|
+
// The alarm has been cancelled and might not even exist anymore.
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
(*schedule_handle)->DoFire();
|
|
223
|
+
}
|
|
224
|
+
// Clean up all of the alarms in the front that have been cancelled.
|
|
225
|
+
while (!alarms_.empty()) {
|
|
226
|
+
if (alarms_.begin()->second.expired()) {
|
|
227
|
+
alarms_.erase(alarms_.begin());
|
|
228
|
+
} else {
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
QuicAlarm* QuicPollEventLoop::AlarmFactory::CreateAlarm(
|
|
235
|
+
QuicAlarm::Delegate* delegate) {
|
|
236
|
+
return new Alarm(loop_, QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
QuicArenaScopedPtr<QuicAlarm> QuicPollEventLoop::AlarmFactory::CreateAlarm(
|
|
240
|
+
QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
|
|
241
|
+
QuicConnectionArena* arena) {
|
|
242
|
+
if (arena != nullptr) {
|
|
243
|
+
return arena->New<Alarm>(loop_, std::move(delegate));
|
|
244
|
+
}
|
|
245
|
+
return QuicArenaScopedPtr<QuicAlarm>(new Alarm(loop_, std::move(delegate)));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
QuicPollEventLoop::Alarm::Alarm(
|
|
249
|
+
QuicPollEventLoop* loop, QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
|
|
250
|
+
: QuicAlarm(std::move(delegate)), loop_(loop) {}
|
|
251
|
+
|
|
252
|
+
void QuicPollEventLoop::Alarm::SetImpl() {
|
|
253
|
+
current_schedule_handle_ = std::make_shared<Alarm*>(this);
|
|
254
|
+
loop_->alarms_.insert({deadline(), current_schedule_handle_});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
void QuicPollEventLoop::Alarm::CancelImpl() {
|
|
258
|
+
current_schedule_handle_.reset();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
QuicAlarmFactory* QuicPollEventLoop::GetAlarmFactory() {
|
|
262
|
+
return &alarm_factory_;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
} // namespace quic
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Copyright 2022 The Chromium Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
#ifndef QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
|
|
6
|
+
#define QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
|
|
7
|
+
|
|
8
|
+
#include <poll.h>
|
|
9
|
+
|
|
10
|
+
#include <memory>
|
|
11
|
+
|
|
12
|
+
#include "absl/container/btree_map.h"
|
|
13
|
+
#include "absl/types/span.h"
|
|
14
|
+
#include "quiche/quic/core/io/quic_event_loop.h"
|
|
15
|
+
#include "quiche/quic/core/quic_alarm.h"
|
|
16
|
+
#include "quiche/quic/core/quic_alarm_factory.h"
|
|
17
|
+
#include "quiche/quic/core/quic_clock.h"
|
|
18
|
+
#include "quiche/quic/core/quic_udp_socket.h"
|
|
19
|
+
#include "quiche/common/quiche_linked_hash_map.h"
|
|
20
|
+
|
|
21
|
+
namespace quic {
|
|
22
|
+
|
|
23
|
+
// A simple and portable implementation of QuicEventLoop using poll(2). Works
|
|
24
|
+
// on all POSIX platforms (and can be potentially made to support Windows using
|
|
25
|
+
// WSAPoll).
|
|
26
|
+
//
|
|
27
|
+
// For most operations, this implementation has a typical runtime of
|
|
28
|
+
// O(N + log M), where N is the number of file descriptors, and M is the number
|
|
29
|
+
// of pending alarms.
|
|
30
|
+
//
|
|
31
|
+
// This API has to deal with the situations where callbacks are modified from
|
|
32
|
+
// the callbacks themselves. To address this, we use the following two
|
|
33
|
+
// approaches:
|
|
34
|
+
// 1. The code does not execute any callbacks until the very end of the
|
|
35
|
+
// processing, when all of the state for the event loop is consistent.
|
|
36
|
+
// 2. The callbacks are stored as weak pointers, since other callbacks can
|
|
37
|
+
// cause them to be unregistered.
|
|
38
|
+
class QUICHE_NO_EXPORT QuicPollEventLoop : public QuicEventLoop {
|
|
39
|
+
public:
|
|
40
|
+
QuicPollEventLoop(QuicClock* clock);
|
|
41
|
+
|
|
42
|
+
// QuicEventLoop implementation.
|
|
43
|
+
bool SupportsEdgeTriggered() const override { return false; }
|
|
44
|
+
ABSL_MUST_USE_RESULT bool RegisterSocket(
|
|
45
|
+
QuicUdpSocketFd fd, QuicSocketEventMask events,
|
|
46
|
+
QuicSocketEventListener* listener) override;
|
|
47
|
+
ABSL_MUST_USE_RESULT bool UnregisterSocket(QuicUdpSocketFd fd) override;
|
|
48
|
+
ABSL_MUST_USE_RESULT bool RearmSocket(QuicUdpSocketFd fd,
|
|
49
|
+
QuicSocketEventMask events) override;
|
|
50
|
+
ABSL_MUST_USE_RESULT bool ArtificiallyNotifyEvent(
|
|
51
|
+
QuicUdpSocketFd fd, QuicSocketEventMask events) override;
|
|
52
|
+
void RunEventLoopOnce(QuicTime::Delta default_timeout) override;
|
|
53
|
+
QuicAlarmFactory* GetAlarmFactory() override;
|
|
54
|
+
|
|
55
|
+
protected:
|
|
56
|
+
// Allows poll(2) calls to be mocked out in unit tests.
|
|
57
|
+
virtual int PollSyscall(pollfd* fds, nfds_t nfds, int timeout) {
|
|
58
|
+
return ::poll(fds, nfds, timeout);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private:
|
|
62
|
+
friend class QuicPollEventLoopPeer;
|
|
63
|
+
|
|
64
|
+
struct Registration {
|
|
65
|
+
QuicSocketEventMask events = 0;
|
|
66
|
+
QuicSocketEventListener* listener;
|
|
67
|
+
|
|
68
|
+
QuicSocketEventMask artificially_notify_at_next_iteration = 0;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
class Alarm : public QuicAlarm {
|
|
72
|
+
public:
|
|
73
|
+
Alarm(QuicPollEventLoop* loop,
|
|
74
|
+
QuicArenaScopedPtr<QuicAlarm::Delegate> delegate);
|
|
75
|
+
|
|
76
|
+
void SetImpl() override;
|
|
77
|
+
void CancelImpl() override;
|
|
78
|
+
|
|
79
|
+
void DoFire() {
|
|
80
|
+
current_schedule_handle_.reset();
|
|
81
|
+
Fire();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private:
|
|
85
|
+
QuicPollEventLoop* loop_;
|
|
86
|
+
// Deleted when the alarm is cancelled, causing the corresponding weak_ptr
|
|
87
|
+
// in the alarm list to not be executed.
|
|
88
|
+
std::shared_ptr<Alarm*> current_schedule_handle_;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
class AlarmFactory : public QuicAlarmFactory {
|
|
92
|
+
public:
|
|
93
|
+
AlarmFactory(QuicPollEventLoop* loop) : loop_(loop) {}
|
|
94
|
+
|
|
95
|
+
// QuicAlarmFactory implementation.
|
|
96
|
+
QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
|
|
97
|
+
QuicArenaScopedPtr<QuicAlarm> CreateAlarm(
|
|
98
|
+
QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
|
|
99
|
+
QuicConnectionArena* arena) override;
|
|
100
|
+
|
|
101
|
+
private:
|
|
102
|
+
QuicPollEventLoop* loop_;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Used for deferred execution of I/O callbacks.
|
|
106
|
+
struct ReadyListEntry {
|
|
107
|
+
QuicUdpSocketFd fd;
|
|
108
|
+
std::weak_ptr<Registration> registration;
|
|
109
|
+
QuicSocketEventMask events;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// We're using a linked hash map here to ensure the events are called in the
|
|
113
|
+
// registration order. This isn't strictly speaking necessary, but makes
|
|
114
|
+
// testing things easier.
|
|
115
|
+
using RegistrationMap =
|
|
116
|
+
quiche::QuicheLinkedHashMap<QuicUdpSocketFd,
|
|
117
|
+
std::shared_ptr<Registration>>;
|
|
118
|
+
// Alarms are stored as weak pointers, since the alarm can be cancelled and
|
|
119
|
+
// disappear while in the queue.
|
|
120
|
+
using AlarmList = absl::btree_multimap<QuicTime, std::weak_ptr<Alarm*>>;
|
|
121
|
+
|
|
122
|
+
// Returns the timeout for the next poll(2) call. It is typically the time at
|
|
123
|
+
// which the next alarm is supposed to activate.
|
|
124
|
+
QuicTime::Delta ComputePollTimeout(QuicTime now,
|
|
125
|
+
QuicTime::Delta default_timeout) const;
|
|
126
|
+
// Calls poll(2) with the provided timeout and dispatches the callbacks
|
|
127
|
+
// accordingly.
|
|
128
|
+
void ProcessIoEvents(QuicTime start_time, QuicTime::Delta timeout);
|
|
129
|
+
// Calls all of the alarm callbacks that are scheduled before or at |time|.
|
|
130
|
+
void ProcessAlarmsUpTo(QuicTime time);
|
|
131
|
+
|
|
132
|
+
// Adds the I/O callbacks for |fd| to the |ready_lits| as appopriate.
|
|
133
|
+
void DispatchIoEvent(std::vector<ReadyListEntry>& ready_list,
|
|
134
|
+
QuicUdpSocketFd fd, short mask); // NOLINT(runtime/int)
|
|
135
|
+
// Runs all of the callbacks on the ready list.
|
|
136
|
+
void RunReadyCallbacks(std::vector<ReadyListEntry>& ready_list);
|
|
137
|
+
|
|
138
|
+
// Calls poll() while handling EINTR. Returns the return value of poll(2)
|
|
139
|
+
// system call.
|
|
140
|
+
int PollWithRetries(absl::Span<pollfd> fds, QuicTime start_time,
|
|
141
|
+
QuicTime::Delta timeout);
|
|
142
|
+
|
|
143
|
+
const QuicClock* clock_;
|
|
144
|
+
RegistrationMap registrations_;
|
|
145
|
+
AlarmList alarms_;
|
|
146
|
+
AlarmFactory alarm_factory_;
|
|
147
|
+
bool has_artificial_events_pending_ = false;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
} // namespace quic
|
|
151
|
+
|
|
152
|
+
#endif // QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_
|