diff --git a/Cargo.lock b/Cargo.lock index 6e95c95..7c9ae4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -295,9 +295,9 @@ checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" [[package]] name = "cc" -version = "1.1.3" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e2d530f35b40a84124146478cd16f34225306a8441998836466a2e2961c950" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" [[package]] name = "certs-grabber" @@ -333,7 +333,6 @@ dependencies = [ "anstyle", "clap_lex", "strsim", - "terminal_size", ] [[package]] @@ -354,21 +353,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" -[[package]] -name = "clio" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7fc6734af48458f72f5a3fa7b840903606427d98a710256e808f76a965047d9" -dependencies = [ - "cfg-if", - "clap", - "is-terminal", - "libc", - "tempfile", - "walkdir", - "windows-sys 0.42.0", -] - [[package]] name = "colorchoice" version = "1.0.1" @@ -545,21 +529,21 @@ dependencies = [ [[package]] name = "epoxy-server" -version = "1.0.0" +version = "2.0.0" dependencies = [ + "anyhow", "bytes", - "cfg-if", - "clap", - "clio", - "console-subscriber", - "dashmap", "fastwebsockets", "futures-util", "http-body-util", "hyper 1.4.1", "hyper-util", + "lazy_static", + "regex", + "serde", "tokio", "tokio-util", + "toml", "wisp-mux", ] @@ -599,8 +583,6 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fastwebsockets" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26da0c7b5cef45c521a6f9cdfffdfeb6c9f5804fbac332deb5ae254634c7a6be" dependencies = [ "base64 0.21.7", "bytes", @@ -1067,17 +1049,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "is-terminal" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.0" @@ -1267,9 +1238,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "c2823eb4c6453ed64055057ea8bd416eda38c71018723869dd043a3b1186115e" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -1299,9 +1270,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -1470,9 +1441,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ "bitflags 2.6.0", ] @@ -1601,15 +1572,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - [[package]] name = "schannel" version = "0.1.23" @@ -1627,9 +1589,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -1640,9 +1602,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -1685,6 +1647,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -1824,30 +1795,20 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "terminal_size" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" -dependencies = [ - "rustix", - "windows-sys 0.48.0", -] - [[package]] name = "thiserror" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", @@ -1866,9 +1827,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.0" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", @@ -1940,6 +1901,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tonic" version = "0.10.2" @@ -2100,16 +2095,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "want" version = "0.3.1" @@ -2247,30 +2232,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -2320,12 +2281,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2338,12 +2293,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2356,12 +2305,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2380,12 +2323,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2398,12 +2335,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2416,12 +2347,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2434,12 +2359,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2452,6 +2371,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374ec40a2d767a3c1b4972d9475ecd557356637be906f2cb3f7fe17a6eb5e22f" +dependencies = [ + "memchr", +] + [[package]] name = "wisp-mux" version = "5.0.0" diff --git a/Cargo.toml b/Cargo.toml index 9900d50..c1638f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["client", "wisp", "simple-wisp-client", "certs-grabber"] +members = ["server", "client", "wisp", "simple-wisp-client", "certs-grabber"] [profile.release] lto = true diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..0e8871d --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "epoxy-server" +version = "2.0.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.86" +bytes = "1.6.1" +fastwebsockets = { version = "0.8.0", features = ["unstable-split", "upgrade"] } +futures-util = "0.3.30" +http-body-util = "0.1.2" +hyper = { version = "1.4.1", features = ["server", "http1"] } +hyper-util = { version = "0.1.6", features = ["tokio"] } +lazy_static = "1.5.0" +regex = "1.10.5" +serde = { version = "1.0.204", features = ["derive"] } +tokio = { version = "1.38.1", features = ["full"] } +tokio-util = { version = "0.7.11", features = ["compat", "io-util", "net"] } +toml = "0.8.15" +wisp-mux = { version = "5.0.0", path = "../wisp", features = ["fastwebsockets"] } diff --git a/server/flamegraph.svg b/server/flamegraph.svg new file mode 100644 index 0000000..2fd3f86 --- /dev/null +++ b/server/flamegraph.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch [ld-linux-x86-64.so.2] (6 samples, 0.05%)[unknown] (4 samples, 0.04%)epoxy-server (16 samples, 0.14%)_start (6 samples, 0.05%)__libc_start_main (6 samples, 0.05%)[libc.so.6] (6 samples, 0.05%)main (6 samples, 0.05%)std::sys::backtrace::__rust_begin_short_backtrace (6 samples, 0.05%)core::ops::function::FnOnce::call_once (6 samples, 0.05%)epoxy_server::main (6 samples, 0.05%)tokio::runtime::runtime::Runtime::block_on (6 samples, 0.05%)tokio::runtime::scheduler::multi_thread::MultiThread::block_on (6 samples, 0.05%)tokio::runtime::context::runtime::enter_runtime (6 samples, 0.05%)tokio::runtime::scheduler::multi_thread::MultiThread::block_on::_{{closure}} (6 samples, 0.05%)tokio::runtime::context::blocking::BlockingRegionGuard::block_on (6 samples, 0.05%)tokio::runtime::park::CachedParkThread::block_on (6 samples, 0.05%)tokio::runtime::coop::budget (6 samples, 0.05%)tokio::runtime::coop::with_budget (6 samples, 0.05%)tokio::runtime::park::CachedParkThread::block_on::_{{closure}} (6 samples, 0.05%)epoxy_server::main::_{{closure}} (6 samples, 0.05%)epoxy_server::stream::ServerListener::new::_{{closure}} (5 samples, 0.04%)tokio::net::tcp::listener::TcpListener::bind::_{{closure}} (5 samples, 0.04%)tokio::net::tcp::listener::TcpListener::bind_addr (5 samples, 0.04%)tokio::net::tcp::listener::TcpListener::new (5 samples, 0.04%)tokio::io::poll_evented::PollEvented<E>::new (5 samples, 0.04%)tokio::io::poll_evented::PollEvented<E>::new_with_interest (5 samples, 0.04%)tokio::runtime::scheduler::Handle::current (4 samples, 0.04%)tokio::runtime::context::current::with_current (4 samples, 0.04%)std::thread::local::LocalKey<T>::try_with (4 samples, 0.04%)tokio::runtime::context::current::with_current::_{{closure}} (4 samples, 0.04%)core::cell::RefCell<T>::borrow (4 samples, 0.04%)core::cell::RefCell<T>::try_borrow (4 samples, 0.04%)core::cell::BorrowRef::new (4 samples, 0.04%)core::cell::Cell<T>::get (4 samples, 0.04%)<tokio::io::util::read_buf::ReadBuf<R,B> as core::future::future::Future>::poll (2 samples, 0.02%)<futures_util::io::fill_buf::FillBuf<R> as core::future::future::Future>::poll (4 samples, 0.04%)<wisp_mux::stream::MuxStreamAsyncRead as futures_io::if_std::AsyncBufRead>::poll_fill_buf (4 samples, 0.04%)<futures_util::stream::try_stream::into_async_read::IntoAsyncRead<St> as futures_io::if_std::AsyncBufRead>::poll_fill_buf (4 samples, 0.04%)<S as futures_core::stream::TryStream>::try_poll_next (4 samples, 0.04%)<wisp_mux::stream::MuxStreamIoStream as futures_core::stream::Stream>::poll_next (4 samples, 0.04%)<core::pin::Pin<P> as futures_core::stream::Stream>::poll_next (4 samples, 0.04%)epoxy_server::stream::copy_read_fast::_{{closure}} (13 samples, 0.11%)futures_util::io::AsyncBufReadExt::consume_unpin (9 samples, 0.08%)<wisp_mux::stream::MuxStreamAsyncRead as futures_io::if_std::AsyncBufRead>::consume (9 samples, 0.08%)<futures_util::stream::try_stream::into_async_read::IntoAsyncRead<St> as futures_io::if_std::AsyncBufRead>::consume (9 samples, 0.08%)core::ptr::drop_in_place<futures_util::stream::try_stream::into_async_read::ReadState<bytes::bytes::Bytes>> (9 samples, 0.08%)core::ptr::drop_in_place<bytes::bytes::Bytes> (9 samples, 0.08%)<bytes::bytes::Bytes as core::ops::drop::Drop>::drop (9 samples, 0.08%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::poll_flush (3 samples, 0.03%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::poll_flush (3 samples, 0.03%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::poll_ready (7 samples, 0.06%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::poll_ready (7 samples, 0.06%)alloc::vec::Vec<T,A>::with_capacity_in (3 samples, 0.03%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (3 samples, 0.03%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (3 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (3 samples, 0.03%)alloc::alloc::Global::alloc_impl (3 samples, 0.03%)alloc::alloc::alloc (3 samples, 0.03%)__rdl_alloc (3 samples, 0.03%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (3 samples, 0.03%)<bytes::bytes_mut::BytesMut as core::convert::From<&[u8]>>::from (6 samples, 0.05%)alloc::slice::<impl [T]>::to_vec (6 samples, 0.05%)alloc::slice::<impl [T]>::to_vec_in (6 samples, 0.05%)alloc::slice::hack::to_vec (6 samples, 0.05%)<T as alloc::slice::hack::ConvertVec>::to_vec (6 samples, 0.05%)core::ptr::const_ptr::<impl *const T>::copy_to_nonoverlapping (3 samples, 0.03%)core::intrinsics::copy_nonoverlapping (3 samples, 0.03%)epoxy_server::handle_stream::_{{closure}} (32 samples, 0.28%)epoxy_server::handle_stream::_{{closure}}::_{{closure}} (32 samples, 0.28%)<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (32 samples, 0.28%)epoxy_server::handle_stream::_{{closure}}::_{{closure}}::_{{closure}} (32 samples, 0.28%)tokio::io::util::copy::copy::_{{closure}} (19 samples, 0.17%)<tokio::io::util::copy::Copy<R,W> as core::future::future::Future>::poll (19 samples, 0.17%)tokio::io::util::copy::CopyBuffer::poll_copy (19 samples, 0.17%)tokio::io::util::copy::CopyBuffer::poll_write_buf (19 samples, 0.17%)<tokio_util::compat::Compat<T> as tokio::io::async_write::AsyncWrite>::poll_write (19 samples, 0.17%)<wisp_mux::stream::MuxStreamAsyncWrite as futures_io::if_std::AsyncWrite>::poll_write (19 samples, 0.17%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::start_send (9 samples, 0.08%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::start_send (3 samples, 0.03%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll (36 samples, 0.32%)tokio::runtime::coop::with_unconstrained (35 samples, 0.31%)tokio::runtime::coop::with_budget (35 samples, 0.31%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll::_{{closure}} (35 samples, 0.31%)wisp_mux::MuxInner::server_into_future::_{{closure}} (3 samples, 0.03%)wisp_mux::MuxInner::as_future::_{{closure}} (3 samples, 0.03%)<futures_util::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (3 samples, 0.03%)wisp_mux::MuxInner::as_future::_{{closure}}::_{{closure}} (3 samples, 0.03%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3 samples, 0.03%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_flush (4 samples, 0.04%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_ready (2 samples, 0.02%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::start_send (7 samples, 0.06%)<wisp_mux::ws::AppendingWebSocketRead<R> as wisp_mux::ws::WebSocketRead>::wisp_read_frame::_{{closure}} (5 samples, 0.04%)<core::pin::Pin<P> as core::future::future::Future>::poll (3 samples, 0.03%)[libc.so.6] (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (2 samples, 0.02%)tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time::_{{closure}} (5 samples, 0.04%)[[heap]] (17 samples, 0.15%)tokio::runtime::time::wheel::Wheel::next_expiration (3 samples, 0.03%)<event_listener::EventListener<T> as core::future::future::Future>::poll (7 samples, 0.06%)event_listener::InnerListener<T,B>::poll_internal (3 samples, 0.03%)event_listener::sys::<impl event_listener::Inner<T>>::register (3 samples, 0.03%)event_listener::TaskRef::into_task (3 samples, 0.03%)<core::task::wake::Waker as core::clone::Clone>::clone (3 samples, 0.03%)<futures_util::lock::mutex::MutexLockFuture<T> as core::future::future::Future>::poll (7 samples, 0.06%)<tokio::io::util::write_all::WriteAll<W> as core::future::future::Future>::poll (7 samples, 0.06%)<&mut T as tokio::io::async_write::AsyncWrite>::poll_write (6 samples, 0.05%)<tokio_util::either::Either<L,R> as tokio::io::async_write::AsyncWrite>::poll_write (6 samples, 0.05%)<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (6 samples, 0.05%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_flush (2 samples, 0.02%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_ready (3 samples, 0.03%)core::pin::Pin<Ptr>::set (9 samples, 0.08%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::start_send (12 samples, 0.11%)wisp_mux::sink_unfold::UnfoldState<T,Fut>::take_value (3 samples, 0.03%)<wisp_mux::stream::MuxStreamAsyncWrite as futures_io::if_std::AsyncWrite>::poll_flush (2 samples, 0.02%)<wisp_mux::ws::AppendingWebSocketRead<R> as wisp_mux::ws::WebSocketRead>::wisp_read_frame::_{{closure}} (3 samples, 0.03%)<wisp_mux::ws::Payload as bytes::buf::buf_impl::Buf>::advance (3 samples, 0.03%)[libc.so.6] (20 samples, 0.18%)__floattidf (2 samples, 0.02%)bytes::bytes::promotable_even_drop (2 samples, 0.02%)<core::sync::atomic::AtomicPtr<T> as bytes::loom::sync::atomic::AtomicMut<T>>::with_mut (2 samples, 0.02%)bytes::bytes_mut::BytesMut::split_to (4 samples, 0.04%)core::fmt::Arguments::new_v1 (3 samples, 0.03%)bytes::bytes_mut::shared_v_drop (3 samples, 0.03%)<core::sync::atomic::AtomicPtr<T> as bytes::loom::sync::atomic::AtomicMut<T>>::with_mut (3 samples, 0.03%)bytes::bytes_mut::shared_v_drop::_{{closure}} (3 samples, 0.03%)core::ptr::drop_in_place<event_listener::EventListener> (2 samples, 0.02%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>>>> (2 samples, 0.02%)core::ptr::drop_in_place<alloc::boxed::Box<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>>> (2 samples, 0.02%)core::ptr::drop_in_place<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>> (2 samples, 0.02%)event_listener::_::<impl core::ops::drop::Drop for event_listener::InnerListener<T,B>>::drop (2 samples, 0.02%)event_listener::_::<impl core::ops::drop::Drop for event_listener::InnerListener<T,B>>::drop::__drop_inner (2 samples, 0.02%)core::ptr::drop_in_place<flume::async::RecvFut<bytes::bytes::Bytes>> (4 samples, 0.04%)core::ptr::drop_in_place<futures_util::lock::mutex::MutexGuard<alloc::boxed::Box<dyn wisp_mux::ws::WebSocketWrite+core::marker::Send>>> (3 samples, 0.03%)core::ptr::drop_in_place<wisp_mux::fastwebsockets::<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<tokio_util::either::Either<tokio::net::tcp::split_owned::OwnedWriteHalf,tokio::net::unix::split_owned::OwnedWriteHalf>>>::wisp_write_split::{{closure}}> (2 samples, 0.02%)event_listener::Event<T>::listen (4 samples, 0.04%)alloc::boxed::Box<T>::pin (2 samples, 0.02%)alloc::boxed::Box<T>::new (2 samples, 0.02%)alloc::alloc::exchange_malloc (2 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.02%)alloc::alloc::Global::alloc_impl (2 samples, 0.02%)alloc::alloc::alloc (2 samples, 0.02%)__rdl_alloc (2 samples, 0.02%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (2 samples, 0.02%)core::ptr::drop_in_place<fastwebsockets::frame::Frame> (6 samples, 0.05%)core::ptr::drop_in_place<fastwebsockets::frame::Payload> (6 samples, 0.05%)fastwebsockets::WebSocketWrite<S>::write_frame::_{{closure}} (16 samples, 0.14%)fastwebsockets::WriteHalf::write_frame::_{{closure}} (12 samples, 0.11%)fastwebsockets::frame::Frame::write (4 samples, 0.04%)core::slice::<impl [T]>::copy_from_slice (4 samples, 0.04%)core::intrinsics::copy_nonoverlapping (4 samples, 0.04%)futures_util::lock::mutex::Mutex<T>::remove_waker (6 samples, 0.05%)malloc (6 samples, 0.05%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read (3 samples, 0.03%)mio::io_source::IoSource<T>::do_io (3 samples, 0.03%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (3 samples, 0.03%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read::_{{closure}} (3 samples, 0.03%)<&std::net::tcp::TcpStream as std::io::Read>::read (3 samples, 0.03%)std::sys_common::net::TcpStream::read (3 samples, 0.03%)std::sys::pal::unix::net::Socket::read (3 samples, 0.03%)std::sys::pal::unix::net::Socket::recv_with_flags (3 samples, 0.03%)tokio::net::tcp::stream::TcpStream::poll_read_priv (5 samples, 0.04%)tokio::io::poll_evented::PollEvented<E>::poll_read (4 samples, 0.04%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write (4 samples, 0.04%)mio::io_source::IoSource<T>::do_io (4 samples, 0.04%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (4 samples, 0.04%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write::_{{closure}} (4 samples, 0.04%)<&std::net::tcp::TcpStream as std::io::Write>::write (4 samples, 0.04%)std::sys_common::net::TcpStream::write (4 samples, 0.04%)tokio::net::tcp::stream::TcpStream::poll_write_priv (11 samples, 0.10%)tokio::io::poll_evented::PollEvented<E>::poll_write (10 samples, 0.09%)tokio::runtime::io::registration::Registration::poll_write_ready (6 samples, 0.05%)tokio::runtime::io::registration::Registration::poll_ready (9 samples, 0.08%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::worker::Context::run_task (6 samples, 0.05%)tokio::runtime::coop::budget (4 samples, 0.04%)tokio::runtime::coop::with_budget (4 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (4 samples, 0.04%)tokio::runtime::task::LocalNotified<S>::run (4 samples, 0.04%)tokio::runtime::task::raw::RawTask::poll (4 samples, 0.04%)tokio::runtime::task::raw::poll (2 samples, 0.02%)tokio::runtime::task::harness::Harness<T,S>::poll (2 samples, 0.02%)tokio::runtime::task::harness::Harness<T,S>::poll_inner (2 samples, 0.02%)tokio::runtime::task::harness::poll_future (2 samples, 0.02%)std::panic::catch_unwind (2 samples, 0.02%)std::panicking::try (2 samples, 0.02%)std::panicking::try::do_call (2 samples, 0.02%)<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (2 samples, 0.02%)tokio::runtime::task::harness::poll_future::_{{closure}} (2 samples, 0.02%)tokio::runtime::task::core::Core<T,S>::poll (2 samples, 0.02%)tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut (2 samples, 0.02%)tokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (2 samples, 0.02%)<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::run (2 samples, 0.02%)tokio::runtime::context::runtime::enter_runtime (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (2 samples, 0.02%)tokio::runtime::context::set_scheduler (2 samples, 0.02%)std::thread::local::LocalKey<T>::with (2 samples, 0.02%)std::thread::local::LocalKey<T>::try_with (2 samples, 0.02%)tokio::runtime::context::set_scheduler::_{{closure}} (2 samples, 0.02%)tokio::runtime::context::scoped::Scoped<T>::set (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Context::run (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Context::park (2 samples, 0.02%)tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time::_{{closure}} (9 samples, 0.08%)tokio::runtime::time::wheel::Wheel::next_expiration (13 samples, 0.11%)wisp_mux::fastwebsockets::<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_split (3 samples, 0.03%)alloc::boxed::Box<T>::pin (2 samples, 0.02%)alloc::boxed::Box<T>::new (2 samples, 0.02%)alloc::alloc::exchange_malloc (2 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.02%)alloc::alloc::Global::alloc_impl (2 samples, 0.02%)alloc::alloc::alloc (2 samples, 0.02%)__rdl_alloc (2 samples, 0.02%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (2 samples, 0.02%)wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_split::_{{closure}} (11 samples, 0.10%)<wisp_mux::packet::Packet as wisp_mux::packet::Encode>::encode (2 samples, 0.02%)<wisp_mux::packet::PacketType as wisp_mux::packet::Encode>::encode (2 samples, 0.02%)bytes::bytes_mut::BytesMut::extend_from_slice (2 samples, 0.02%)core::intrinsics::copy_nonoverlapping (2 samples, 0.02%)wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for bytes::bytes_mut::BytesMut>::from (8 samples, 0.07%)bytes::bytes_mut::BytesMut::with_capacity (5 samples, 0.04%)alloc::vec::Vec<T>::with_capacity (5 samples, 0.04%)alloc::vec::Vec<T,A>::with_capacity_in (5 samples, 0.04%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (5 samples, 0.04%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (5 samples, 0.04%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (5 samples, 0.04%)alloc::alloc::Global::alloc_impl (5 samples, 0.04%)alloc::alloc::alloc (5 samples, 0.04%)__rdl_alloc (5 samples, 0.04%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (5 samples, 0.04%)[anon] (230 samples, 2.02%)[..wisp_mux::stream::MuxStreamRead::read::_{{closure}}::_{{closure}}::_{{closure}} (13 samples, 0.11%)[epoxy-server] (3 samples, 0.03%)tokio::loom::std::parking_lot::Mutex<T>::lock (9 samples, 0.08%)lock_api::mutex::Mutex<R,T>::lock (9 samples, 0.08%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (9 samples, 0.08%)parking_lot::raw_mutex::RawMutex::lock_slow (9 samples, 0.08%)parking_lot_core::parking_lot::park (9 samples, 0.08%)parking_lot_core::parking_lot::with_thread_data (9 samples, 0.08%)parking_lot_core::parking_lot::park::_{{closure}} (9 samples, 0.08%)<parking_lot_core::thread_parker::imp::ThreadParker as parking_lot_core::thread_parker::ThreadParkerT>::park (4 samples, 0.04%)parking_lot_core::thread_parker::imp::ThreadParker::futex_wait (4 samples, 0.04%)syscall (4 samples, 0.04%)<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.02%)<std::time::Instant as core::ops::arith::Sub>::sub (3 samples, 0.03%)std::time::Instant::duration_since (3 samples, 0.03%)std::time::Instant::checked_duration_since (3 samples, 0.03%)std::sys::pal::unix::time::Instant::checked_sub_instant (3 samples, 0.03%)std::sys::pal::unix::time::Timespec::sub_timespec (2 samples, 0.02%)compiler_builtins::float::conv::int_to_float::u128_to_f64_bits (5 samples, 0.04%)core::num::<impl u128>::leading_zeros (2 samples, 0.02%)__floattidf (7 samples, 0.06%)compiler_builtins::float::conv::__floattidf (7 samples, 0.06%)core::num::<impl i128>::unsigned_abs (2 samples, 0.02%)core::num::<impl i128>::wrapping_abs (2 samples, 0.02%)std::f64::<impl f64>::powf (14 samples, 0.12%)pow (14 samples, 0.12%)[libm.so.6] (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::stats::Stats::end_processing_scheduled_tasks (47 samples, 0.41%)std::sys::pal::unix::time::Timespec::now (15 samples, 0.13%)clock_gettime (15 samples, 0.13%)__vdso_clock_gettime (7 samples, 0.06%)std::sys::pal::unix::time::Timespec::now (4 samples, 0.04%)clock_gettime (3 samples, 0.03%)__vdso_clock_gettime (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::stats::Stats::start_processing_scheduled_tasks (5 samples, 0.04%)core::iter::traits::iterator::Iterator::collect (2 samples, 0.02%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (2 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (2 samples, 0.02%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (2 samples, 0.02%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.02%)alloc::vec::Vec<T,A>::extend_trusted (2 samples, 0.02%)core::iter::traits::iterator::Iterator::for_each (2 samples, 0.02%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.02%)core::iter::traits::iterator::Iterator::fold (2 samples, 0.02%)core::iter::adapters::map::map_fold::_{{closure}} (2 samples, 0.02%)tokio::runtime::time::Driver::park_internal::_{{closure}} (2 samples, 0.02%)tokio::runtime::time::Inner::lock_sharded_wheel (2 samples, 0.02%)tokio::loom::std::parking_lot::Mutex<T>::lock (2 samples, 0.02%)lock_api::mutex::Mutex<R,T>::lock (2 samples, 0.02%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (2 samples, 0.02%)core::sync::atomic::AtomicU8::compare_exchange_weak (2 samples, 0.02%)core::sync::atomic::atomic_compare_exchange_weak (2 samples, 0.02%)core::iter::traits::iterator::Iterator::min (2 samples, 0.02%)core::iter::traits::iterator::Iterator::min_by (2 samples, 0.02%)core::iter::traits::iterator::Iterator::reduce (2 samples, 0.02%)<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.02%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find_map (2 samples, 0.02%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (2 samples, 0.02%)tokio::runtime::time::Driver::park_internal::_{{closure}} (2 samples, 0.02%)tokio::runtime::time::wheel::Wheel::next_expiration_time (2 samples, 0.02%)tokio::runtime::time::wheel::Wheel::next_expiration (2 samples, 0.02%)tokio::runtime::time::Inner::lock_sharded_wheel (2 samples, 0.02%)tokio::loom::std::parking_lot::Mutex<T>::lock (2 samples, 0.02%)lock_api::mutex::Mutex<R,T>::lock (2 samples, 0.02%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (2 samples, 0.02%)core::sync::atomic::AtomicU8::compare_exchange_weak (2 samples, 0.02%)core::sync::atomic::atomic_compare_exchange_weak (2 samples, 0.02%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process (6 samples, 0.05%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_time (6 samples, 0.05%)core::iter::traits::iterator::Iterator::min (6 samples, 0.05%)core::iter::traits::iterator::Iterator::min_by (6 samples, 0.05%)core::iter::traits::iterator::Iterator::reduce (6 samples, 0.05%)<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.05%)core::iter::traits::iterator::Iterator::find_map (6 samples, 0.05%)core::iter::traits::iterator::Iterator::try_fold (6 samples, 0.05%)core::iter::traits::iterator::Iterator::find_map::check::_{{closure}} (6 samples, 0.05%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (6 samples, 0.05%)tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time::_{{closure}} (5 samples, 0.04%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_sharded_time (5 samples, 0.04%)tokio::runtime::time::wheel::Wheel::poll (2 samples, 0.02%)tokio::runtime::time::wheel::Wheel::next_expiration (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Context::maintenance (18 samples, 0.16%)tokio::runtime::scheduler::multi_thread::worker::Context::park_timeout (15 samples, 0.13%)tokio::runtime::scheduler::multi_thread::park::Parker::park_timeout (15 samples, 0.13%)tokio::runtime::time::Driver::park_internal (15 samples, 0.13%)tokio::runtime::time::Driver::park_thread_timeout (3 samples, 0.03%)tokio::runtime::driver::IoStack::park_timeout (3 samples, 0.03%)<alloc::sync::Arc<T,A> as core::ops::deref::Deref>::deref (2 samples, 0.02%)alloc::sync::Arc<T,A>::inner (2 samples, 0.02%)core::ptr::non_null::NonNull<T>::as_ref (2 samples, 0.02%)core::cell::RefCell<T>::borrow_mut (2 samples, 0.02%)core::cell::RefCell<T>::try_borrow_mut (2 samples, 0.02%)core::cell::BorrowRefMut::new (2 samples, 0.02%)core::ptr::drop_in_place<core::option::Option<alloc::boxed::Box<tokio::runtime::scheduler::multi_thread::worker::Core>>> (2 samples, 0.02%)tokio::runtime::scheduler::defer::Defer::wake (3 samples, 0.03%)core::ptr::drop_in_place<core::cell::RefMut<alloc::vec::Vec<core::task::wake::Waker>>> (2 samples, 0.02%)core::ptr::drop_in_place<core::cell::BorrowRefMut> (2 samples, 0.02%)<core::cell::BorrowRefMut as core::ops::drop::Drop>::drop (2 samples, 0.02%)core::cell::Cell<T>::set (2 samples, 0.02%)core::cell::Cell<T>::replace (2 samples, 0.02%)core::mem::replace (2 samples, 0.02%)core::ptr::write (2 samples, 0.02%)core::result::Result<T,E>::is_ok (2 samples, 0.02%)core::sync::atomic::AtomicUsize::compare_exchange (10 samples, 0.09%)core::sync::atomic::atomic_compare_exchange (10 samples, 0.09%)<parking_lot_core::thread_parker::imp::ThreadParker as parking_lot_core::thread_parker::ThreadParkerT>::park (6 samples, 0.05%)core::sync::atomic::AtomicI32::load (6 samples, 0.05%)core::sync::atomic::atomic_load (6 samples, 0.05%)parking_lot_core::parking_lot::hash (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::park::Inner::park_condvar (9 samples, 0.08%)tokio::loom::std::parking_lot::Condvar::wait (9 samples, 0.08%)parking_lot::condvar::Condvar::wait (9 samples, 0.08%)parking_lot::condvar::Condvar::wait_until_internal (9 samples, 0.08%)parking_lot_core::parking_lot::park (9 samples, 0.08%)parking_lot_core::parking_lot::with_thread_data (9 samples, 0.08%)parking_lot_core::parking_lot::park::_{{closure}} (9 samples, 0.08%)parking_lot_core::parking_lot::lock_bucket (3 samples, 0.03%)core::sync::atomic::AtomicUsize::compare_exchange (7 samples, 0.06%)core::sync::atomic::atomic_compare_exchange (7 samples, 0.06%)core::sync::atomic::AtomicUsize::swap (15 samples, 0.13%)core::sync::atomic::atomic_swap (15 samples, 0.13%)tokio::runtime::driver::Handle::time (4 samples, 0.04%)core::option::Option<T>::as_ref (4 samples, 0.04%)core::slice::<impl [T]>::get_unchecked (6 samples, 0.05%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (6 samples, 0.05%)core::slice::index::get_noubcheck (6 samples, 0.05%)core::result::Result<T,E>::is_err (6 samples, 0.05%)core::result::Result<T,E>::is_ok (6 samples, 0.05%)core::iter::adapters::map::map_fold::_{{closure}} (164 samples, 1.44%)tokio::runtime::time::Driver::park_internal::_{{closure}} (164 samples, 1.44%)tokio::runtime::time::Inner::lock_sharded_wheel (160 samples, 1.40%)tokio::loom::std::parking_lot::Mutex<T>::lock (144 samples, 1.26%)lock_api::mutex::Mutex<R,T>::lock (144 samples, 1.26%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (144 samples, 1.26%)core::sync::atomic::AtomicU8::compare_exchange_weak (138 samples, 1.21%)core::sync::atomic::atomic_compare_exchange_weak (138 samples, 1.21%)<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (165 samples, 1.45%)alloc::vec::Vec<T,A>::extend_trusted (165 samples, 1.45%)core::iter::traits::iterator::Iterator::for_each (165 samples, 1.45%)<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (165 samples, 1.45%)core::iter::traits::iterator::Iterator::fold (165 samples, 1.45%)__rdl_alloc (17 samples, 0.15%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (17 samples, 0.15%)malloc (17 samples, 0.15%)core::iter::traits::iterator::Iterator::collect (185 samples, 1.62%)<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (185 samples, 1.62%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (185 samples, 1.62%)<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (185 samples, 1.62%)alloc::vec::Vec<T>::with_capacity (20 samples, 0.18%)alloc::vec::Vec<T,A>::with_capacity_in (20 samples, 0.18%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (20 samples, 0.18%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (20 samples, 0.18%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (18 samples, 0.16%)alloc::alloc::Global::alloc_impl (18 samples, 0.16%)alloc::alloc::alloc (18 samples, 0.16%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.06%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.06%)tokio::runtime::time::wheel::level::Level::next_expiration (28 samples, 0.25%)tokio::runtime::time::wheel::level::Level::next_occupied_slot (28 samples, 0.25%)core::iter::traits::iterator::Iterator::min (122 samples, 1.07%)core::iter::traits::iterator::Iterator::min_by (122 samples, 1.07%)core::iter::traits::iterator::Iterator::reduce (122 samples, 1.07%)<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (122 samples, 1.07%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find_map (122 samples, 1.07%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (114 samples, 1.00%)tokio::runtime::time::Driver::park_internal::_{{closure}} (114 samples, 1.00%)tokio::runtime::time::wheel::Wheel::next_expiration_time (114 samples, 1.00%)tokio::runtime::time::wheel::Wheel::next_expiration (114 samples, 1.00%)tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::is_empty (8 samples, 0.07%)core::option::Option<T>::is_some (8 samples, 0.07%)core::result::Result<T,E>::is_ok (9 samples, 0.08%)<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (124 samples, 1.09%)core::ptr::drop_in_place<[tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::time::wheel::Wheel>]> (124 samples, 1.09%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::time::wheel::Wheel>> (122 samples, 1.07%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::time::wheel::Wheel>> (122 samples, 1.07%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (122 samples, 1.07%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (122 samples, 1.07%)core::sync::atomic::AtomicU8::compare_exchange (113 samples, 0.99%)core::sync::atomic::atomic_compare_exchange (113 samples, 0.99%)core::mem::drop (138 samples, 1.21%)core::ptr::drop_in_place<alloc::vec::Vec<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::time::wheel::Wheel>>> (138 samples, 1.21%)core::ptr::drop_in_place<alloc::raw_vec::RawVec<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::time::wheel::Wheel>>> (14 samples, 0.12%)<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (14 samples, 0.12%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (14 samples, 0.12%)alloc::alloc::dealloc (14 samples, 0.12%)__rdl_dealloc (14 samples, 0.12%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (14 samples, 0.12%)cfree (14 samples, 0.12%)[libc.so.6] (5 samples, 0.04%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<alloc::vec::Vec<std::process::Child>>> (3 samples, 0.03%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,alloc::vec::Vec<std::process::Child>>> (3 samples, 0.03%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (3 samples, 0.03%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (3 samples, 0.03%)core::sync::atomic::AtomicU8::compare_exchange (2 samples, 0.02%)core::sync::atomic::atomic_compare_exchange (2 samples, 0.02%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<core::option::Option<tokio::sync::watch::Receiver<()>>>> (8 samples, 0.07%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,core::option::Option<tokio::sync::watch::Receiver<()>>>> (8 samples, 0.07%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (8 samples, 0.07%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (8 samples, 0.07%)core::sync::atomic::AtomicU8::compare_exchange (8 samples, 0.07%)core::sync::atomic::atomic_compare_exchange (8 samples, 0.07%)tokio::loom::std::parking_lot::Mutex<T>::lock (4 samples, 0.04%)lock_api::mutex::Mutex<R,T>::lock (4 samples, 0.04%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (4 samples, 0.04%)core::sync::atomic::AtomicU8::compare_exchange_weak (4 samples, 0.04%)core::sync::atomic::atomic_compare_exchange_weak (4 samples, 0.04%)core::sync::atomic::AtomicU8::compare_exchange_weak (11 samples, 0.10%)core::sync::atomic::atomic_compare_exchange_weak (11 samples, 0.10%)tokio::process::imp::GlobalOrphanQueue::reap_orphans (33 samples, 0.29%)tokio::process::imp::orphan::OrphanQueueImpl<T>::reap_orphans (33 samples, 0.29%)tokio::loom::std::parking_lot::Mutex<T>::try_lock (15 samples, 0.13%)lock_api::mutex::Mutex<R,T>::try_lock (15 samples, 0.13%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::try_lock (15 samples, 0.13%)core::sync::atomic::AtomicU8::load (2 samples, 0.02%)core::sync::atomic::atomic_load (2 samples, 0.02%)tokio::runtime::driver::IoStack::park (2 samples, 0.02%)mio::event::event::Event::token (2 samples, 0.02%)mio::sys::unix::selector::epoll::event::token (2 samples, 0.02%)[libc.so.6] (37 samples, 0.32%)mio::poll::Poll::poll (96 samples, 0.84%)mio::sys::unix::selector::epoll::Selector::select (96 samples, 0.84%)epoll_wait (67 samples, 0.59%)[unknown] (6 samples, 0.05%)core::sync::atomic::AtomicUsize::compare_exchange (61 samples, 0.54%)core::sync::atomic::atomic_compare_exchange (61 samples, 0.54%)core::sync::atomic::AtomicUsize::load (42 samples, 0.37%)core::sync::atomic::atomic_load (42 samples, 0.37%)tokio::runtime::io::scheduled_io::ScheduledIo::set_readiness (105 samples, 0.92%)core::mem::drop (52 samples, 0.46%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::io::scheduled_io::Waiters>> (52 samples, 0.46%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::io::scheduled_io::Waiters>> (52 samples, 0.46%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (52 samples, 0.46%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (52 samples, 0.46%)core::sync::atomic::AtomicU8::compare_exchange (52 samples, 0.46%)core::sync::atomic::atomic_compare_exchange (52 samples, 0.46%)core::option::Option<T>::take (3 samples, 0.03%)core::mem::replace (3 samples, 0.03%)core::ptr::read (3 samples, 0.03%)tokio::loom::std::parking_lot::Mutex<T>::lock (10 samples, 0.09%)lock_api::mutex::Mutex<R,T>::lock (10 samples, 0.09%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (10 samples, 0.09%)core::sync::atomic::AtomicU8::compare_exchange_weak (9 samples, 0.08%)core::sync::atomic::atomic_compare_exchange_weak (9 samples, 0.08%)tokio::runtime::task::harness::<impl tokio::runtime::task::raw::RawTask>::drop_reference (3 samples, 0.03%)tokio::runtime::task::state::State::ref_dec (3 samples, 0.03%)core::sync::atomic::AtomicUsize::fetch_sub (2 samples, 0.02%)core::sync::atomic::atomic_sub (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::with_current (5 samples, 0.04%)tokio::runtime::context::with_scheduler (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_local (4 samples, 0.04%)tokio::runtime::task::raw::RawTask::schedule (7 samples, 0.06%)core::sync::atomic::AtomicUsize::compare_exchange (4 samples, 0.04%)core::sync::atomic::atomic_compare_exchange (4 samples, 0.04%)tokio::runtime::io::driver::Driver::turn (295 samples, 2.59%)to..tokio::runtime::io::scheduled_io::ScheduledIo::wake (86 samples, 0.75%)tokio::util::wake_list::WakeList::wake_all (17 samples, 0.15%)core::task::wake::Waker::wake (17 samples, 0.15%)tokio::runtime::task::waker::wake_by_val (17 samples, 0.15%)tokio::runtime::task::harness::<impl tokio::runtime::task::raw::RawTask>::wake_by_val (17 samples, 0.15%)tokio::runtime::task::state::State::transition_to_notified_by_val (7 samples, 0.06%)tokio::runtime::task::state::State::fetch_update_action (7 samples, 0.06%)tokio::runtime::task::state::State::transition_to_notified_by_val::_{{closure}} (2 samples, 0.02%)core::ops::function::FnOnce::call_once (3 samples, 0.03%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (3 samples, 0.03%)std::sys::thread_local::native::eager::Storage<T>::get (3 samples, 0.03%)core::cell::Cell<T>::get (2 samples, 0.02%)tokio::runtime::context::thread_rng_n (5 samples, 0.04%)std::thread::local::LocalKey<T>::with (5 samples, 0.04%)std::thread::local::LocalKey<T>::try_with (5 samples, 0.04%)tokio::runtime::context::thread_rng_n::_{{closure}} (2 samples, 0.02%)core::result::Result<T,E>::is_ok (3 samples, 0.03%)core::mem::drop (61 samples, 0.54%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::time::wheel::Wheel>> (61 samples, 0.54%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::time::wheel::Wheel>> (61 samples, 0.54%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (61 samples, 0.54%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (61 samples, 0.54%)core::sync::atomic::AtomicU8::compare_exchange (58 samples, 0.51%)core::sync::atomic::atomic_compare_exchange (58 samples, 0.51%)core::slice::<impl [T]>::get_unchecked (5 samples, 0.04%)<usize as core::slice::index::SliceIndex<[T]>>::get_unchecked (5 samples, 0.04%)core::slice::index::get_noubcheck (5 samples, 0.04%)core::result::Result<T,E>::is_err (5 samples, 0.04%)core::result::Result<T,E>::is_ok (5 samples, 0.04%)tokio::runtime::time::Inner::lock_sharded_wheel (133 samples, 1.17%)tokio::loom::std::parking_lot::Mutex<T>::lock (112 samples, 0.98%)lock_api::mutex::Mutex<R,T>::lock (112 samples, 0.98%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (112 samples, 0.98%)core::sync::atomic::AtomicU8::compare_exchange_weak (107 samples, 0.94%)core::sync::atomic::atomic_compare_exchange_weak (107 samples, 0.94%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.04%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.04%)tokio::runtime::time::wheel::level::Level::next_expiration (43 samples, 0.38%)tokio::runtime::time::wheel::level::Level::next_occupied_slot (43 samples, 0.38%)tokio::runtime::time::wheel::Wheel::next_expiration (114 samples, 1.00%)tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::is_empty (4 samples, 0.04%)core::option::Option<T>::is_some (4 samples, 0.04%)tokio::runtime::time::wheel::Wheel::set_elapsed (18 samples, 0.16%)tokio::runtime::time::wheel::Wheel::poll (141 samples, 1.24%)tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::pop_back (9 samples, 0.08%)tokio::runtime::time::wheel::level::Level::next_expiration (20 samples, 0.18%)tokio::runtime::time::wheel::level::Level::next_occupied_slot (20 samples, 0.18%)tokio::runtime::time::wheel::Wheel::poll_at (74 samples, 0.65%)tokio::runtime::time::wheel::Wheel::next_expiration (74 samples, 0.65%)tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::is_empty (18 samples, 0.16%)core::option::Option<T>::is_some (18 samples, 0.16%)core::iter::traits::iterator::Iterator::min (449 samples, 3.94%)core..core::iter::traits::iterator::Iterator::min_by (449 samples, 3.94%)core..core::iter::traits::iterator::Iterator::reduce (449 samples, 3.94%)core..<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (449 samples, 3.94%)<cor..core::iter::traits::iterator::Iterator::find_map (449 samples, 3.94%)core..core::iter::traits::iterator::Iterator::try_fold (449 samples, 3.94%)core..core::iter::traits::iterator::Iterator::find_map::check::_{{closure}} (446 samples, 3.91%)core..core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (446 samples, 3.91%)core..tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time::_{{closure}} (437 samples, 3.83%)toki..tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_sharded_time (432 samples, 3.79%)toki..tokio::util::wake_list::WakeList::wake_all (2 samples, 0.02%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_time (452 samples, 3.97%)toki..core::time::Duration::as_millis (3 samples, 0.03%)tokio::runtime::time::source::TimeSource::instant_to_tick (12 samples, 0.11%)tokio::time::instant::Instant::saturating_duration_since (8 samples, 0.07%)std::time::Instant::duration_since (8 samples, 0.07%)std::time::Instant::checked_duration_since (7 samples, 0.06%)std::sys::pal::unix::time::Instant::checked_sub_instant (7 samples, 0.06%)std::sys::pal::unix::time::Timespec::sub_timespec (6 samples, 0.05%)std::sys::pal::unix::time::Timespec::now (25 samples, 0.22%)clock_gettime (23 samples, 0.20%)__vdso_clock_gettime (21 samples, 0.18%)tokio::runtime::scheduler::multi_thread::park::Inner::park_driver (1,316 samples, 11.55%)tokio::runtime::s..tokio::runtime::time::Driver::park_internal (1,286 samples, 11.28%)tokio::runtime::t..tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process (498 samples, 4.37%)tokio..tokio::runtime::time::source::TimeSource::now (38 samples, 0.33%)tokio::time::clock::Clock::now (26 samples, 0.23%)tokio::time::clock::now (26 samples, 0.23%)tokio::runtime::scheduler::multi_thread::park::Parker::park (1,346 samples, 11.81%)tokio::runtime::sc..tokio::runtime::scheduler::multi_thread::park::Inner::park (1,346 samples, 11.81%)tokio::runtime::sc..tokio::util::try_lock::TryLock<T>::try_lock (9 samples, 0.08%)core::sync::atomic::AtomicBool::compare_exchange (9 samples, 0.08%)core::sync::atomic::atomic_compare_exchange (9 samples, 0.08%)tokio::runtime::scheduler::multi_thread::worker::Context::park_timeout (1,364 samples, 11.97%)tokio::runtime::sc..tokio::runtime::scheduler::multi_thread::worker::Core::should_notify_others (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::queue::Local<T>::len (2 samples, 0.02%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::scheduler::multi_thread::worker::Synced>> (8 samples, 0.07%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::scheduler::multi_thread::worker::Synced>> (8 samples, 0.07%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (8 samples, 0.07%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (8 samples, 0.07%)core::sync::atomic::AtomicU8::compare_exchange (7 samples, 0.06%)core::sync::atomic::atomic_compare_exchange (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::worker::Core::maintenance (15 samples, 0.13%)tokio::loom::std::parking_lot::Mutex<T>::lock (3 samples, 0.03%)lock_api::mutex::Mutex<R,T>::lock (3 samples, 0.03%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (3 samples, 0.03%)core::sync::atomic::AtomicU8::compare_exchange_weak (2 samples, 0.02%)core::sync::atomic::atomic_compare_exchange_weak (2 samples, 0.02%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::scheduler::multi_thread::worker::Synced>> (7 samples, 0.06%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::scheduler::multi_thread::worker::Synced>> (7 samples, 0.06%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (7 samples, 0.06%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (7 samples, 0.06%)core::sync::atomic::AtomicU8::compare_exchange (7 samples, 0.06%)core::sync::atomic::atomic_compare_exchange (7 samples, 0.06%)core::slice::<impl [T]>::contains (7 samples, 0.06%)<T as core::slice::cmp::SliceContains>::slice_contains (7 samples, 0.06%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::any (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::idle::Idle::is_parked (21 samples, 0.18%)tokio::loom::std::parking_lot::Mutex<T>::lock (7 samples, 0.06%)lock_api::mutex::Mutex<R,T>::lock (7 samples, 0.06%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (7 samples, 0.06%)core::sync::atomic::AtomicU8::compare_exchange_weak (7 samples, 0.06%)core::sync::atomic::atomic_compare_exchange_weak (7 samples, 0.06%)alloc::vec::Vec<T,A>::swap_remove (2 samples, 0.02%)alloc::vec::Vec<T,A>::set_len (2 samples, 0.02%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::scheduler::multi_thread::worker::Synced>> (3 samples, 0.03%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::scheduler::multi_thread::worker::Synced>> (3 samples, 0.03%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (3 samples, 0.03%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (3 samples, 0.03%)core::sync::atomic::AtomicU8::compare_exchange (3 samples, 0.03%)core::sync::atomic::atomic_compare_exchange (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::idle::Idle::unpark_worker_by_id (10 samples, 0.09%)tokio::runtime::scheduler::multi_thread::idle::State::unpark_one (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_add (2 samples, 0.02%)core::sync::atomic::atomic_add (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Core::transition_from_parked (36 samples, 0.32%)tokio::runtime::scheduler::multi_thread::worker::Core::has_tasks (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::queue::Local<T>::has_tasks (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::queue::Inner<T>::is_empty (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::queue::Inner<T>::len (3 samples, 0.03%)core::sync::atomic::AtomicU64::load (3 samples, 0.03%)core::sync::atomic::atomic_load (3 samples, 0.03%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::scheduler::multi_thread::worker::Synced>> (6 samples, 0.05%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::scheduler::multi_thread::worker::Synced>> (6 samples, 0.05%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (6 samples, 0.05%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (6 samples, 0.05%)core::sync::atomic::AtomicU8::compare_exchange (5 samples, 0.04%)core::sync::atomic::atomic_compare_exchange (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::idle::Idle::transition_worker_to_parked (13 samples, 0.11%)tokio::runtime::scheduler::multi_thread::idle::State::dec_num_unparked (5 samples, 0.04%)core::sync::atomic::AtomicUsize::fetch_sub (5 samples, 0.04%)core::sync::atomic::atomic_sub (5 samples, 0.04%)core::sync::atomic::AtomicU32::load (5 samples, 0.04%)core::sync::atomic::atomic_load (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::notify_if_work_pending (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::queue::Steal<T>::is_empty (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::queue::Inner<T>::is_empty (6 samples, 0.05%)tokio::runtime::scheduler::multi_thread::queue::Inner<T>::len (6 samples, 0.05%)tokio::runtime::scheduler::multi_thread::worker::Context::park (1,452 samples, 12.74%)tokio::runtime::sch..tokio::runtime::scheduler::multi_thread::worker::Core::transition_to_parked (23 samples, 0.20%)tokio::runtime::scheduler::multi_thread::worker::Core::has_tasks (2 samples, 0.02%)core::ops::function::FnOnce::call_once (2 samples, 0.02%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (2 samples, 0.02%)std::sys::thread_local::native::eager::Storage<T>::get (2 samples, 0.02%)core::cell::Cell<T>::get (2 samples, 0.02%)core::ptr::drop_in_place<core::result::Result<tokio::runtime::coop::with_budget::ResetGuard,std::thread::local::AccessError>> (3 samples, 0.03%)core::ptr::drop_in_place<tokio::runtime::coop::with_budget::ResetGuard> (3 samples, 0.03%)<tokio::runtime::coop::with_budget::ResetGuard as core::ops::drop::Drop>::drop (3 samples, 0.03%)tokio::runtime::context::budget (3 samples, 0.03%)std::thread::local::LocalKey<T>::try_with (3 samples, 0.03%)core::cell::RefCell<T>::borrow_mut (8 samples, 0.07%)core::cell::RefCell<T>::try_borrow_mut (8 samples, 0.07%)core::cell::BorrowRefMut::new (8 samples, 0.07%)core::ptr::read (3 samples, 0.03%)core::option::Option<T>::take (4 samples, 0.04%)core::mem::replace (4 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::Context::reset_lifo_enabled (5 samples, 0.04%)<alloc::sync::Arc<T,A> as core::ops::deref::Deref>::deref (2 samples, 0.02%)alloc::sync::Arc<T,A>::inner (2 samples, 0.02%)core::ptr::non_null::NonNull<T>::as_ref (2 samples, 0.02%)core::sync::atomic::AtomicUsize::load (2 samples, 0.02%)core::sync::atomic::atomic_load (2 samples, 0.02%)parking_lot_core::parking_lot::FairTimeout::should_timeout (2 samples, 0.02%)std::sys::pal::unix::time::Timespec::now (2 samples, 0.02%)clock_gettime (2 samples, 0.02%)parking_lot_core::parking_lot::hash (2 samples, 0.02%)parking_lot::condvar::Condvar::notify_one_slow (9 samples, 0.08%)parking_lot_core::parking_lot::unpark_requeue (8 samples, 0.07%)parking_lot_core::parking_lot::lock_bucket_pair (3 samples, 0.03%)core::sync::atomic::AtomicUsize::swap (3 samples, 0.03%)core::sync::atomic::atomic_swap (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::park::Unparker::unpark (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::park::Inner::unpark (5 samples, 0.04%)tokio::runtime::scheduler::multi_thread::queue::Local<T>::push_back_or_overflow (3 samples, 0.03%)core::sync::atomic::AtomicU64::load (2 samples, 0.02%)core::sync::atomic::atomic_load (2 samples, 0.02%)alloc::vec::Vec<T,A>::pop (3 samples, 0.03%)core::ptr::read (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::idle::Idle::notify_should_wakeup (6 samples, 0.05%)core::sync::atomic::AtomicUsize::fetch_add (6 samples, 0.05%)core::sync::atomic::atomic_add (6 samples, 0.05%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::task::Schedule for alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle>>::yield_now (35 samples, 0.31%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task (35 samples, 0.31%)tokio::runtime::scheduler::multi_thread::worker::with_current (35 samples, 0.31%)tokio::runtime::context::with_scheduler (35 samples, 0.31%)tokio::runtime::scheduler::multi_thread::worker::_<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_task::_{{closure}} (34 samples, 0.30%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::schedule_local (30 samples, 0.26%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::notify_parked_local (13 samples, 0.11%)tokio::runtime::scheduler::multi_thread::idle::Idle::worker_to_notify (11 samples, 0.10%)core::pin::Pin<Ptr>::set (18 samples, 0.16%)wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for bytes::bytes_mut::BytesMut>::from (2 samples, 0.02%)<T as core::convert::Into<U>>::into (3 samples, 0.03%)wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for wisp_mux::ws::Frame>::from (3 samples, 0.03%)<core::pin::Pin<P> as futures_core::future::FusedFuture>::is_terminated (6 samples, 0.05%)<flume::async::RecvFut<T> as futures_core::future::FusedFuture>::is_terminated (6 samples, 0.05%)flume::Shared<T>::is_disconnected (6 samples, 0.05%)core::sync::atomic::AtomicBool::load (6 samples, 0.05%)core::sync::atomic::atomic_load (6 samples, 0.05%)core::task::poll::Poll<T>::map (8 samples, 0.07%)alloc::collections::vec_deque::VecDeque<T,A>::buffer_read (7 samples, 0.06%)core::ptr::read (7 samples, 0.06%)alloc::collections::vec_deque::wrap_index (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::pop_front (11 samples, 0.10%)alloc::collections::vec_deque::VecDeque<T,A>::to_physical_idx (3 samples, 0.03%)alloc::collections::vec_deque::VecDeque<T,A>::wrap_add (3 samples, 0.03%)core::mem::drop (9 samples, 0.08%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<flume::Chan<bytes::bytes::Bytes>>> (9 samples, 0.08%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (9 samples, 0.08%)std::sys::sync::mutex::futex::Mutex::unlock (9 samples, 0.08%)core::sync::atomic::AtomicU32::swap (9 samples, 0.08%)core::sync::atomic::atomic_swap (9 samples, 0.08%)flume::Chan<T>::pull_pending (7 samples, 0.06%)flume::Hook<T,S>::trigger (3 samples, 0.03%)alloc::sync::Arc<T>::new (3 samples, 0.03%)alloc::boxed::Box<T>::new (3 samples, 0.03%)alloc::alloc::exchange_malloc (3 samples, 0.03%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (3 samples, 0.03%)alloc::alloc::Global::alloc_impl (3 samples, 0.03%)alloc::alloc::alloc (3 samples, 0.03%)__rdl_alloc (3 samples, 0.03%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (3 samples, 0.03%)malloc (3 samples, 0.03%)flume::async::RecvFut<T>::poll_inner::_{{closure}} (4 samples, 0.04%)core::result::Result<T,E>::is_err (2 samples, 0.02%)core::result::Result<T,E>::is_ok (2 samples, 0.02%)core::sync::atomic::AtomicU32::compare_exchange (17 samples, 0.15%)core::sync::atomic::atomic_compare_exchange (17 samples, 0.15%)flume::Shared<T>::recv (56 samples, 0.49%)flume::wait_lock (21 samples, 0.18%)std::sync::mutex::Mutex<T>::lock (21 samples, 0.18%)std::sys::sync::mutex::futex::Mutex::lock (21 samples, 0.18%)alloc::collections::vec_deque::VecDeque<T,A>::pop_front (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::buffer_read (2 samples, 0.02%)core::ptr::read (2 samples, 0.02%)flume::Chan<T>::pull_pending (3 samples, 0.03%)<flume::async::RecvFut<T> as core::future::future::Future>::poll (67 samples, 0.59%)flume::async::RecvFut<T>::poll_inner (67 samples, 0.59%)flume::Shared<T>::recv_sync (6 samples, 0.05%)flume::Shared<T>::recv (6 samples, 0.05%)core::cell::Cell<T>::replace (3 samples, 0.03%)core::mem::replace (3 samples, 0.03%)core::ptr::write (3 samples, 0.03%)core::cell::Cell<T>::set (4 samples, 0.04%)core::ptr::drop_in_place<event_listener::sys::ListLock<()>> (5 samples, 0.04%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<event_listener::sys::Inner<()>>> (5 samples, 0.04%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (5 samples, 0.04%)std::sys::sync::mutex::futex::Mutex::unlock (5 samples, 0.04%)core::sync::atomic::AtomicU32::swap (4 samples, 0.04%)core::sync::atomic::atomic_swap (4 samples, 0.04%)event_listener::TaskRef::into_task (6 samples, 0.05%)<core::task::wake::Waker as core::clone::Clone>::clone (6 samples, 0.05%)tokio::runtime::task::waker::clone_waker (6 samples, 0.05%)tokio::runtime::task::state::State::ref_inc (6 samples, 0.05%)core::sync::atomic::AtomicUsize::fetch_add (6 samples, 0.05%)core::sync::atomic::atomic_add (6 samples, 0.05%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (119 samples, 1.04%)wisp_mux::stream::MuxStreamRead::read::_{{closure}}::_{{closure}}::_{{closure}} (118 samples, 1.04%)futures_util::future::future::FutureExt::poll_unpin (93 samples, 0.82%)<core::pin::Pin<P> as core::future::future::Future>::poll (92 samples, 0.81%)<futures_util::future::future::fuse::Fuse<Fut> as core::future::future::Future>::poll (25 samples, 0.22%)<event_listener::EventListener<T> as core::future::future::Future>::poll (25 samples, 0.22%)event_listener::InnerListener<T,B>::poll_internal (24 samples, 0.21%)event_listener::sys::<impl event_listener::Inner<T>>::register (24 samples, 0.21%)event_listener::sys::<impl event_listener::Inner<T>>::lock (6 samples, 0.05%)std::sync::mutex::Mutex<T>::lock (6 samples, 0.05%)std::sys::sync::mutex::futex::Mutex::lock (6 samples, 0.05%)core::sync::atomic::AtomicU32::compare_exchange (6 samples, 0.05%)core::sync::atomic::atomic_compare_exchange (6 samples, 0.05%)core::slice::<impl [T]>::swap (8 samples, 0.07%)core::ptr::swap (8 samples, 0.07%)core::intrinsics::copy_nonoverlapping (8 samples, 0.07%)<futures_util::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (137 samples, 1.20%)wisp_mux::stream::MuxStreamRead::read::_{{closure}}::_{{closure}} (137 samples, 1.20%)futures_util::async_await::random::shuffle (11 samples, 0.10%)futures_util::async_await::random::gen_index (3 samples, 0.03%)futures_util::async_await::random::random (3 samples, 0.03%)std::thread::local::LocalKey<T>::with (3 samples, 0.03%)std::thread::local::LocalKey<T>::try_with (3 samples, 0.03%)futures_util::async_await::random::random::_{{closure}} (3 samples, 0.03%)core::cell::Cell<T>::set (2 samples, 0.02%)core::cell::Cell<T>::replace (2 samples, 0.02%)core::mem::replace (2 samples, 0.02%)core::ptr::write (2 samples, 0.02%)alloc::sync::Arc<T,A>::drop_slow (3 samples, 0.03%)core::ptr::drop_in_place<flume::Hook<bytes::bytes::Bytes,dyn flume::signal::Signal>> (2 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<flume::Hook<bytes::bytes::Bytes,dyn flume::signal::Signal>>> (6 samples, 0.05%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (6 samples, 0.05%)cfree (3 samples, 0.03%)core::sync::atomic::AtomicBool::load (3 samples, 0.03%)core::sync::atomic::atomic_load (3 samples, 0.03%)<flume::async::RecvFut<T> as core::ops::drop::Drop>::drop (12 samples, 0.11%)flume::async::RecvFut<T>::reset_hook (12 samples, 0.11%)core::ptr::drop_in_place<flume::async::RecvFut<bytes::bytes::Bytes>> (13 samples, 0.11%)cfree (8 samples, 0.07%)[libc.so.6] (2 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<event_listener::Inner<()>>> (9 samples, 0.08%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (9 samples, 0.08%)core::sync::atomic::AtomicUsize::fetch_sub (9 samples, 0.08%)core::sync::atomic::atomic_sub (9 samples, 0.08%)core::ptr::drop_in_place<core::option::Option<event_listener::State<()>>> (5 samples, 0.04%)core::ptr::drop_in_place<event_listener::State<()>> (5 samples, 0.04%)core::ptr::drop_in_place<event_listener::Task> (5 samples, 0.04%)core::ptr::drop_in_place<core::task::wake::Waker> (4 samples, 0.04%)<core::task::wake::Waker as core::ops::drop::Drop>::drop (4 samples, 0.04%)tokio::runtime::task::waker::drop_waker (4 samples, 0.04%)tokio::runtime::task::harness::<impl tokio::runtime::task::raw::RawTask>::drop_reference (4 samples, 0.04%)tokio::runtime::task::state::State::ref_dec (4 samples, 0.04%)core::sync::atomic::AtomicUsize::fetch_sub (3 samples, 0.03%)core::sync::atomic::atomic_sub (3 samples, 0.03%)core::ptr::drop_in_place<event_listener::sys::ListLock<()>> (8 samples, 0.07%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<event_listener::sys::Inner<()>>> (7 samples, 0.06%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (7 samples, 0.06%)std::sys::sync::mutex::futex::Mutex::unlock (7 samples, 0.06%)core::sync::atomic::AtomicU32::swap (6 samples, 0.05%)core::sync::atomic::atomic_swap (6 samples, 0.05%)event_listener::sys::<impl event_listener::Inner<T>>::lock (10 samples, 0.09%)std::sync::mutex::Mutex<T>::lock (10 samples, 0.09%)std::sys::sync::mutex::futex::Mutex::lock (10 samples, 0.09%)core::sync::atomic::AtomicU32::compare_exchange (10 samples, 0.09%)core::sync::atomic::atomic_compare_exchange (10 samples, 0.09%)core::ptr::drop_in_place<futures_util::future::future::fuse::Fuse<event_listener::EventListener>> (53 samples, 0.46%)core::ptr::drop_in_place<core::option::Option<event_listener::EventListener>> (53 samples, 0.46%)core::ptr::drop_in_place<event_listener::EventListener> (45 samples, 0.39%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>>>> (45 samples, 0.39%)core::ptr::drop_in_place<alloc::boxed::Box<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>>> (45 samples, 0.39%)core::ptr::drop_in_place<event_listener::InnerListener<(),alloc::sync::Arc<event_listener::Inner<()>>>> (45 samples, 0.39%)event_listener::_::<impl core::ops::drop::Drop for event_listener::InnerListener<T,B>>::drop (35 samples, 0.31%)event_listener::_::<impl core::ops::drop::Drop for event_listener::InnerListener<T,B>>::drop::__drop_inner (35 samples, 0.31%)event_listener::sys::<impl event_listener::Inner<T>>::remove (27 samples, 0.24%)event_listener::sys::Inner<T>::remove (8 samples, 0.07%)core::sync::atomic::AtomicBool::load (11 samples, 0.10%)core::sync::atomic::atomic_load (11 samples, 0.10%)core::sync::atomic::AtomicU32::fetch_add (13 samples, 0.11%)core::sync::atomic::atomic_add (13 samples, 0.11%)<alloc::sync::Arc<T,A> as core::clone::Clone>::clone (26 samples, 0.23%)core::sync::atomic::AtomicUsize::fetch_add (26 samples, 0.23%)core::sync::atomic::atomic_add (26 samples, 0.23%)alloc::boxed::Box<T>::pin (6 samples, 0.05%)alloc::boxed::Box<T>::new (6 samples, 0.05%)alloc::alloc::exchange_malloc (6 samples, 0.05%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (6 samples, 0.05%)alloc::alloc::Global::alloc_impl (6 samples, 0.05%)alloc::alloc::alloc (6 samples, 0.05%)__rdl_alloc (6 samples, 0.05%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (6 samples, 0.05%)malloc (5 samples, 0.04%)event_listener::Event<T>::inner (16 samples, 0.14%)core::sync::atomic::AtomicPtr<T>::load (15 samples, 0.13%)core::sync::atomic::atomic_load (15 samples, 0.13%)core::pin::Pin<Ptr>::set (2 samples, 0.02%)core::ptr::drop_in_place<event_listener::sys::ListLock<()>> (9 samples, 0.08%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<event_listener::sys::Inner<()>>> (8 samples, 0.07%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (8 samples, 0.07%)std::sys::sync::mutex::futex::Mutex::unlock (8 samples, 0.07%)core::sync::atomic::AtomicU32::swap (8 samples, 0.07%)core::sync::atomic::atomic_swap (8 samples, 0.07%)event_listener::Event<T>::listen (75 samples, 0.66%)event_listener::InnerListener<T,B>::listen (26 samples, 0.23%)event_listener::sys::<impl event_listener::Inner<T>>::insert (26 samples, 0.23%)event_listener::sys::<impl event_listener::Inner<T>>::lock (13 samples, 0.11%)std::sync::mutex::Mutex<T>::lock (13 samples, 0.11%)std::sys::sync::mutex::futex::Mutex::lock (13 samples, 0.11%)core::sync::atomic::AtomicU32::compare_exchange (13 samples, 0.11%)core::sync::atomic::atomic_compare_exchange (13 samples, 0.11%)<tokio::io::util::write_all::WriteAll<W> as core::future::future::Future>::poll (5 samples, 0.04%)<&mut T as tokio::io::async_write::AsyncWrite>::poll_write (5 samples, 0.04%)<tokio_util::either::Either<L,R> as tokio::io::async_write::AsyncWrite>::poll_write (5 samples, 0.04%)<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (5 samples, 0.04%)tokio::net::tcp::stream::TcpStream::poll_write_priv (5 samples, 0.04%)tokio::io::poll_evented::PollEvented<E>::poll_write (3 samples, 0.03%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write (3 samples, 0.03%)mio::io_source::IoSource<T>::do_io (3 samples, 0.03%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (3 samples, 0.03%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write::_{{closure}} (3 samples, 0.03%)<&std::net::tcp::TcpStream as std::io::Write>::write (3 samples, 0.03%)std::sys_common::net::TcpStream::write (3 samples, 0.03%)__send (3 samples, 0.03%)[libc.so.6] (3 samples, 0.03%)core::ptr::drop_in_place<fastwebsockets::frame::Frame> (2 samples, 0.02%)core::ptr::drop_in_place<fastwebsockets::frame::Payload> (2 samples, 0.02%)cfree (2 samples, 0.02%)<core::pin::Pin<P> as core::future::future::Future>::poll (12 samples, 0.11%)wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_frame::_{{closure}} (12 samples, 0.11%)fastwebsockets::WebSocketWrite<S>::write_frame::_{{closure}} (9 samples, 0.08%)fastwebsockets::WriteHalf::write_frame::_{{closure}} (8 samples, 0.07%)<S as futures_core::stream::TryStream>::try_poll_next (367 samples, 3.22%)<S ..<wisp_mux::stream::MuxStreamIoStream as futures_core::stream::Stream>::poll_next (367 samples, 3.22%)<wi..<core::pin::Pin<P> as futures_core::stream::Stream>::poll_next (367 samples, 3.22%)<co..<futures_util::stream::unfold::Unfold<T,F,Fut> as futures_core::stream::Stream>::poll_next (366 samples, 3.21%)<fu..wisp_mux::stream::MuxStreamRead::into_inner_stream::_{{closure}}::_{{closure}} (333 samples, 2.92%)wi..wisp_mux::stream::MuxStreamRead::read::_{{closure}} (327 samples, 2.87%)wi..wisp_mux::ws::LockedWebSocketWrite::write_frame::_{{closure}} (16 samples, 0.14%)core::ptr::drop_in_place<futures_util::stream::try_stream::into_async_read::ReadState<bytes::bytes::Bytes>> (2 samples, 0.02%)<wisp_mux::stream::MuxStreamAsyncRead as futures_io::if_std::AsyncBufRead>::poll_fill_buf (381 samples, 3.34%)<wi..<futures_util::stream::try_stream::into_async_read::IntoAsyncRead<St> as futures_io::if_std::AsyncBufRead>::poll_fill_buf (381 samples, 3.34%)<fu..core::slice::index::<impl core::ops::index::Index<I> for [T]>::index (3 samples, 0.03%)<core::ops::range::RangeFrom<usize> as core::slice::index::SliceIndex<[T]>>::index (3 samples, 0.03%)<futures_util::io::fill_buf::FillBuf<R> as core::future::future::Future>::poll (385 samples, 3.38%)<fu..core::option::Option<T>::take (3 samples, 0.03%)core::mem::replace (3 samples, 0.03%)core::ptr::write (2 samples, 0.02%)[libc.so.6] (69 samples, 0.61%)__send (118 samples, 1.04%)[unknown] (11 samples, 0.10%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write (122 samples, 1.07%)mio::io_source::IoSource<T>::do_io (122 samples, 1.07%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (122 samples, 1.07%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write::_{{closure}} (122 samples, 1.07%)<&std::net::tcp::TcpStream as std::io::Write>::write (122 samples, 1.07%)std::sys_common::net::TcpStream::write (122 samples, 1.07%)std::sys::pal::unix::cvt (3 samples, 0.03%)core::sync::atomic::AtomicUsize::load (25 samples, 0.22%)core::sync::atomic::atomic_load (25 samples, 0.22%)<tokio::io::util::write::Write<W> as core::future::future::Future>::poll (154 samples, 1.35%)<&mut T as tokio::io::async_write::AsyncWrite>::poll_write (154 samples, 1.35%)<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (154 samples, 1.35%)tokio::net::tcp::stream::TcpStream::poll_write_priv (154 samples, 1.35%)tokio::io::poll_evented::PollEvented<E>::poll_write (153 samples, 1.34%)tokio::runtime::io::registration::Registration::poll_write_ready (29 samples, 0.25%)tokio::runtime::io::registration::Registration::poll_ready (29 samples, 0.25%)tokio::runtime::io::scheduled_io::ScheduledIo::poll_readiness (28 samples, 0.25%)tokio::util::bit::Pack::unpack (2 samples, 0.02%)tokio::util::bit::unpack (2 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (212 samples, 1.86%)<..alloc::alloc::dealloc (212 samples, 1.86%)a..__rdl_dealloc (212 samples, 1.86%)_..std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (212 samples, 1.86%)s..cfree (212 samples, 1.86%)c..[libc.so.6] (190 samples, 1.67%)[libc.so.6] (158 samples, 1.39%)[libc.so.6] (133 samples, 1.17%)[libc.so.6] (8 samples, 0.07%)core::mem::drop (214 samples, 1.88%)c..core::ptr::drop_in_place<alloc::boxed::Box<bytes::bytes_mut::Shared>> (214 samples, 1.88%)c..core::ptr::drop_in_place<bytes::bytes_mut::Shared> (214 samples, 1.88%)c..core::ptr::drop_in_place<alloc::vec::Vec<u8>> (214 samples, 1.88%)c..core::ptr::drop_in_place<alloc::raw_vec::RawVec<u8>> (214 samples, 1.88%)c..<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop (214 samples, 1.88%)<..alloc::raw_vec::RawVec<T,A>::current_memory (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_sub (32 samples, 0.28%)core::sync::atomic::atomic_sub (32 samples, 0.28%)bytes::bytes_mut::shared_v_drop (251 samples, 2.20%)b..<core::sync::atomic::AtomicPtr<T> as bytes::loom::sync::atomic::AtomicMut<T>>::with_mut (251 samples, 2.20%)<..bytes::bytes_mut::shared_v_drop::_{{closure}} (251 samples, 2.20%)b..bytes::bytes_mut::release_shared (251 samples, 2.20%)b..core::sync::atomic::AtomicUsize::load (4 samples, 0.04%)core::sync::atomic::atomic_load (4 samples, 0.04%)epoxy_server::stream::copy_read_fast::_{{closure}} (1,014 samples, 8.90%)epoxy_server:..futures_util::io::AsyncBufReadExt::consume_unpin (448 samples, 3.93%)futu..<wisp_mux::stream::MuxStreamAsyncRead as futures_io::if_std::AsyncBufRead>::consume (448 samples, 3.93%)<wis..<futures_util::stream::try_stream::into_async_read::IntoAsyncRead<St> as futures_io::if_std::AsyncBufRead>::consume (448 samples, 3.93%)<fut..core::ptr::drop_in_place<futures_util::stream::try_stream::into_async_read::ReadState<bytes::bytes::Bytes>> (444 samples, 3.90%)core..core::ptr::drop_in_place<bytes::bytes::Bytes> (444 samples, 3.90%)core..<bytes::bytes::Bytes as core::ops::drop::Drop>::drop (444 samples, 3.90%)<byt..cfree (192 samples, 1.68%)[libc.so.6] (154 samples, 1.35%)[libc.so.6] (93 samples, 0.82%)[libc.so.6] (79 samples, 0.69%)[libc.so.6] (8 samples, 0.07%)<alloc::sync::Arc<T,A> as core::ops::deref::Deref>::deref (4 samples, 0.04%)alloc::sync::Arc<T,A>::inner (4 samples, 0.04%)core::ptr::non_null::NonNull<T>::as_ref (4 samples, 0.04%)[libc.so.6] (231 samples, 2.03%)[..recv (374 samples, 3.28%)recv[unknown] (33 samples, 0.29%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read (376 samples, 3.30%)<&m..mio::io_source::IoSource<T>::do_io (376 samples, 3.30%)mio..mio::sys::unix::stateless_io_source::IoSourceState::do_io (376 samples, 3.30%)mio..<&mio::net::tcp::stream::TcpStream as std::io::Read>::read::_{{closure}} (376 samples, 3.30%)<&m..<&std::net::tcp::TcpStream as std::io::Read>::read (376 samples, 3.30%)<&s..std::sys_common::net::TcpStream::read (376 samples, 3.30%)std..std::sys::pal::unix::net::Socket::read (376 samples, 3.30%)std..std::sys::pal::unix::net::Socket::recv_with_flags (376 samples, 3.30%)std..std::sys::pal::unix::cvt (2 samples, 0.02%)<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.02%)std::io::error::Error::kind (8 samples, 0.07%)std::io::error::repr_bitpacked::Repr::data (8 samples, 0.07%)std::io::error::repr_bitpacked::decode_repr (8 samples, 0.07%)tokio::io::read_buf::ReadBuf::advance (2 samples, 0.02%)tokio::io::read_buf::ReadBuf::set_filled (2 samples, 0.02%)tokio::io::read_buf::ReadBuf::assume_init (3 samples, 0.03%)tokio::io::read_buf::ReadBuf::unfilled_mut (2 samples, 0.02%)core::slice::index::<impl core::ops::index::IndexMut<I> for [T]>::index_mut (2 samples, 0.02%)<core::ops::range::RangeFrom<usize> as core::slice::index::SliceIndex<[T]>>::index_mut (2 samples, 0.02%)core::ptr::drop_in_place<tokio::runtime::coop::RestoreOnPending> (3 samples, 0.03%)<tokio::runtime::coop::RestoreOnPending as core::ops::drop::Drop>::drop (3 samples, 0.03%)tokio::runtime::coop::Budget::is_unconstrained (3 samples, 0.03%)core::option::Option<T>::is_none (3 samples, 0.03%)core::option::Option<T>::is_some (3 samples, 0.03%)core::ops::function::FnOnce::call_once (6 samples, 0.05%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (6 samples, 0.05%)std::sys::thread_local::native::eager::Storage<T>::get (6 samples, 0.05%)core::cell::Cell<T>::get (5 samples, 0.04%)tokio::runtime::coop::poll_proceed (11 samples, 0.10%)tokio::runtime::context::budget (11 samples, 0.10%)std::thread::local::LocalKey<T>::try_with (11 samples, 0.10%)tokio::runtime::context::budget::_{{closure}} (5 samples, 0.04%)tokio::runtime::coop::poll_proceed::_{{closure}} (5 samples, 0.04%)tokio::runtime::coop::Budget::decrement (5 samples, 0.04%)core::sync::atomic::AtomicUsize::load (31 samples, 0.27%)core::sync::atomic::atomic_load (31 samples, 0.27%)<tokio::net::tcp::split_owned::OwnedReadHalf as tokio::io::async_read::AsyncRead>::poll_read (501 samples, 4.40%)<toki..tokio::net::tcp::stream::TcpStream::poll_read_priv (494 samples, 4.33%)tokio..tokio::io::poll_evented::PollEvented<E>::poll_read (461 samples, 4.04%)toki..tokio::runtime::io::registration::Registration::poll_read_ready (62 samples, 0.54%)tokio::runtime::io::registration::Registration::poll_ready (58 samples, 0.51%)tokio::runtime::io::scheduled_io::ScheduledIo::poll_readiness (39 samples, 0.34%)tokio::io::read_buf::ReadBuf::filled (6 samples, 0.05%)tokio::io::read_buf::ReadBuf::new (2 samples, 0.02%)tokio::io::util::copy::CopyBuffer::poll_fill_buf (521 samples, 4.57%)tokio..core::pin::Pin<Ptr>::set (24 samples, 0.21%)core::ptr::drop_in_place<wisp_mux::sink_unfold::UnfoldState<wisp_mux::stream::MuxStreamWrite,wisp_mux::stream::MuxStreamWrite::into_inner_sink::{{closure}}::{{closure}}>> (5 samples, 0.04%)wisp_mux::sink_unfold::UnfoldState<T,Fut>::project_future (2 samples, 0.02%)wisp_mux::sink_unfold::_::<impl wisp_mux::sink_unfold::UnfoldState<T,Fut>>::project (2 samples, 0.02%)core::ptr::drop_in_place<wisp_mux::stream::MuxStreamWrite::write_payload_internal::{{closure}}> (2 samples, 0.02%)<wisp_mux::ws::Payload as core::ops::deref::Deref>::deref (5 samples, 0.04%)bytes::bytes_mut::BytesMut::reserve (2 samples, 0.02%)bytes::bytes_mut::BytesMut::extend_from_slice (11 samples, 0.10%)core::intrinsics::copy_nonoverlapping (9 samples, 0.08%)[libc.so.6] (9 samples, 0.08%)<wisp_mux::packet::PacketType as wisp_mux::packet::Encode>::encode (26 samples, 0.23%)core::ptr::drop_in_place<wisp_mux::ws::Payload> (4 samples, 0.04%)core::ptr::drop_in_place<bytes::bytes_mut::BytesMut> (4 samples, 0.04%)<bytes::bytes_mut::BytesMut as core::ops::drop::Drop>::drop (4 samples, 0.04%)bytes::bytes_mut::BytesMut::reserve (6 samples, 0.05%)bytes::bytes_mut::BytesMut::capacity (4 samples, 0.04%)bytes::buf::buf_mut::BufMut::put_u32_le (9 samples, 0.08%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_mut::BufMut>::put_slice (9 samples, 0.08%)bytes::bytes_mut::BytesMut::extend_from_slice (9 samples, 0.08%)bytes::buf::buf_mut::BufMut::put_u8 (3 samples, 0.03%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_mut::BufMut>::put_slice (3 samples, 0.03%)bytes::bytes_mut::BytesMut::extend_from_slice (3 samples, 0.03%)core::intrinsics::copy_nonoverlapping (2 samples, 0.02%)<wisp_mux::packet::Packet as wisp_mux::packet::Encode>::encode (39 samples, 0.34%)alloc::vec::Vec<T>::with_capacity (39 samples, 0.34%)alloc::vec::Vec<T,A>::with_capacity_in (39 samples, 0.34%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (39 samples, 0.34%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (39 samples, 0.34%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (37 samples, 0.32%)alloc::alloc::Global::alloc_impl (37 samples, 0.32%)alloc::alloc::alloc (37 samples, 0.32%)__rdl_alloc (37 samples, 0.32%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (37 samples, 0.32%)malloc (37 samples, 0.32%)core::cmp::min (3 samples, 0.03%)core::cmp::Ord::min (3 samples, 0.03%)core::cmp::min_by (3 samples, 0.03%)bytes::bytes_mut::BytesMut::with_capacity (52 samples, 0.46%)bytes::bytes_mut::BytesMut::from_vec (13 samples, 0.11%)bytes::bytes_mut::original_capacity_to_repr (9 samples, 0.08%)core::num::<impl usize>::leading_zeros (5 samples, 0.04%)wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for wisp_mux::ws::Frame>::from (111 samples, 0.97%)wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for bytes::bytes_mut::BytesMut>::from (108 samples, 0.95%)wisp_mux::packet::PacketType::get_packet_size (8 samples, 0.07%)<wisp_mux::ws::Payload as core::ops::deref::Deref>::deref (2 samples, 0.02%)<wisp_mux::Role as core::cmp::PartialEq>::eq (2 samples, 0.02%)core::ptr::drop_in_place<wisp_mux::ws::LockedWebSocketWrite::write_split::{{closure}}> (5 samples, 0.04%)core::sync::atomic::AtomicBool::load (4 samples, 0.04%)core::sync::atomic::atomic_load (4 samples, 0.04%)core::ptr::drop_in_place<fastwebsockets::WebSocketWrite<tokio_util::either::Either<tokio::net::tcp::split_owned::OwnedWriteHalf,tokio::net::unix::split_owned::OwnedWriteHalf>>::write_frame::{{closure}}> (4 samples, 0.04%)core::ptr::drop_in_place<fastwebsockets::WriteHalf::write_frame<tokio_util::either::Either<tokio::net::tcp::split_owned::OwnedWriteHalf,tokio::net::unix::split_owned::OwnedWriteHalf>>::{{closure}}> (6 samples, 0.05%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (24 samples, 0.21%)[libc.so.6] (225 samples, 1.97%)[..__send (366 samples, 3.21%)__s..[unknown] (41 samples, 0.36%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write (387 samples, 3.40%)<&m..mio::io_source::IoSource<T>::do_io (387 samples, 3.40%)mio..mio::sys::unix::stateless_io_source::IoSourceState::do_io (387 samples, 3.40%)mio..<&mio::net::tcp::stream::TcpStream as std::io::Write>::write::_{{closure}} (387 samples, 3.40%)<&m..<&std::net::tcp::TcpStream as std::io::Write>::write (387 samples, 3.40%)<&s..std::sys_common::net::TcpStream::write (387 samples, 3.40%)std..std::sys::pal::unix::cvt (20 samples, 0.18%)<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (2 samples, 0.02%)core::ptr::drop_in_place<tokio::runtime::coop::RestoreOnPending> (2 samples, 0.02%)<tokio::runtime::coop::RestoreOnPending as core::ops::drop::Drop>::drop (2 samples, 0.02%)tokio::runtime::coop::Budget::is_unconstrained (2 samples, 0.02%)core::option::Option<T>::is_none (2 samples, 0.02%)core::option::Option<T>::is_some (2 samples, 0.02%)core::ops::function::FnOnce::call_once (2 samples, 0.02%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (2 samples, 0.02%)std::sys::thread_local::native::eager::Storage<T>::get (2 samples, 0.02%)core::cell::Cell<T>::get (2 samples, 0.02%)tokio::runtime::coop::poll_proceed (6 samples, 0.05%)tokio::runtime::context::budget (6 samples, 0.05%)std::thread::local::LocalKey<T>::try_with (6 samples, 0.05%)tokio::runtime::context::budget::_{{closure}} (4 samples, 0.04%)tokio::runtime::coop::poll_proceed::_{{closure}} (4 samples, 0.04%)core::cell::Cell<T>::get (4 samples, 0.04%)core::sync::atomic::AtomicUsize::load (35 samples, 0.31%)core::sync::atomic::atomic_load (35 samples, 0.31%)<&mut T as tokio::io::async_write::AsyncWrite>::poll_write (452 samples, 3.97%)<&mu..<tokio_util::either::Either<L,R> as tokio::io::async_write::AsyncWrite>::poll_write (452 samples, 3.97%)<tok..<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (451 samples, 3.96%)<tok..tokio::net::tcp::stream::TcpStream::poll_write_priv (451 samples, 3.96%)toki..tokio::io::poll_evented::PollEvented<E>::poll_write (445 samples, 3.90%)toki..tokio::runtime::io::registration::Registration::poll_write_ready (54 samples, 0.47%)tokio::runtime::io::registration::Registration::poll_ready (53 samples, 0.46%)tokio::runtime::io::scheduled_io::ScheduledIo::poll_readiness (40 samples, 0.35%)tokio::util::bit::Pack::unpack (4 samples, 0.04%)tokio::util::bit::unpack (4 samples, 0.04%)core::ptr::read (5 samples, 0.04%)<tokio::io::util::write_all::WriteAll<W> as core::future::future::Future>::poll (489 samples, 4.29%)<toki..core::mem::take (6 samples, 0.05%)core::mem::replace (6 samples, 0.05%)cfree (297 samples, 2.61%)cf..[libc.so.6] (217 samples, 1.90%)[..[libc.so.6] (60 samples, 0.53%)[libc.so.6] (35 samples, 0.31%)[libc.so.6] (9 samples, 0.08%)core::ptr::drop_in_place<fastwebsockets::frame::Frame> (324 samples, 2.84%)co..core::ptr::drop_in_place<fastwebsockets::frame::Payload> (324 samples, 2.84%)co..core::ptr::drop_in_place<bytes::bytes_mut::BytesMut> (8 samples, 0.07%)<bytes::bytes_mut::BytesMut as core::ops::drop::Drop>::drop (8 samples, 0.07%)bytes::bytes_mut::rebuild_vec (5 samples, 0.04%)core::ptr::mut_ptr::<impl *mut T>::sub (5 samples, 0.04%)core::ptr::mut_ptr::<impl *mut T>::offset (5 samples, 0.04%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (6 samples, 0.05%)core::slice::<impl [T]>::copy_from_slice (6 samples, 0.05%)core::intrinsics::copy_nonoverlapping (6 samples, 0.05%)[libc.so.6] (4 samples, 0.04%)fastwebsockets::frame::Frame::fmt_head (15 samples, 0.13%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (4 samples, 0.04%)fastwebsockets::frame::Frame::write (33 samples, 0.29%)fastwebsockets::frame::Frame::write::reserve_enough (5 samples, 0.04%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (5 samples, 0.04%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.02%)<core::ptr::non_null::NonNull<T> as core::cmp::PartialEq>::eq (2 samples, 0.02%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find (8 samples, 0.07%)[libc.so.6] (467 samples, 4.10%)[lib..__send (705 samples, 6.19%)__send[unknown] (86 samples, 0.75%)<&mio::net::tcp::stream::TcpStream as std::io::Write>::write (725 samples, 6.36%)<&mio::n..mio::io_source::IoSource<T>::do_io (725 samples, 6.36%)mio::io_..mio::sys::unix::stateless_io_source::IoSourceState::do_io (725 samples, 6.36%)mio::sys..<&mio::net::tcp::stream::TcpStream as std::io::Write>::write::_{{closure}} (725 samples, 6.36%)<&mio::n..<&std::net::tcp::TcpStream as std::io::Write>::write (725 samples, 6.36%)<&std::n..std::sys_common::net::TcpStream::write (725 samples, 6.36%)std::sys..std::sys::pal::unix::cvt (18 samples, 0.16%)<core::result::Result<T,E> as core::ops::try_trait::Try>::branch (4 samples, 0.04%)core::ptr::drop_in_place<tokio::runtime::coop::RestoreOnPending> (2 samples, 0.02%)<tokio::runtime::coop::RestoreOnPending as core::ops::drop::Drop>::drop (2 samples, 0.02%)tokio::runtime::coop::Budget::is_unconstrained (2 samples, 0.02%)core::option::Option<T>::is_none (2 samples, 0.02%)core::option::Option<T>::is_some (2 samples, 0.02%)core::ops::function::FnOnce::call_once (9 samples, 0.08%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (9 samples, 0.08%)std::sys::thread_local::native::eager::Storage<T>::get (9 samples, 0.08%)core::cell::Cell<T>::get (7 samples, 0.06%)tokio::runtime::coop::poll_proceed (11 samples, 0.10%)tokio::runtime::context::budget (11 samples, 0.10%)std::thread::local::LocalKey<T>::try_with (11 samples, 0.10%)tokio::runtime::context::budget::_{{closure}} (2 samples, 0.02%)tokio::runtime::coop::poll_proceed::_{{closure}} (2 samples, 0.02%)tokio::runtime::coop::Budget::decrement (2 samples, 0.02%)core::sync::atomic::AtomicUsize::load (48 samples, 0.42%)core::sync::atomic::atomic_load (48 samples, 0.42%)tokio::runtime::io::driver::Direction::mask (8 samples, 0.07%)<tokio::io::util::write_vectored::WriteVectored<W> as core::future::future::Future>::poll (875 samples, 7.68%)<tokio::io:..<&mut T as tokio::io::async_write::AsyncWrite>::poll_write_vectored (875 samples, 7.68%)<&mut T as ..tokio::io::async_write::AsyncWrite::poll_write_vectored (875 samples, 7.68%)tokio::io::..<tokio_util::either::Either<L,R> as tokio::io::async_write::AsyncWrite>::poll_write (867 samples, 7.61%)<tokio_uti..<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (856 samples, 7.51%)<tokio::ne..tokio::net::tcp::stream::TcpStream::poll_write_priv (845 samples, 7.41%)tokio::net..tokio::io::poll_evented::PollEvented<E>::poll_write (835 samples, 7.33%)tokio::io:..tokio::runtime::io::registration::Registration::poll_write_ready (91 samples, 0.80%)tokio::runtime::io::registration::Registration::poll_ready (87 samples, 0.76%)tokio::runtime::io::scheduled_io::ScheduledIo::poll_readiness (67 samples, 0.59%)tokio::util::bit::Pack::unpack (6 samples, 0.05%)tokio::util::bit::unpack (6 samples, 0.05%)core::array::_<impl core::ops::index::Index<I> for [T: N]>::index (4 samples, 0.04%)core::slice::index::<impl core::ops::index::Index<I> for [T]>::index (4 samples, 0.04%)<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index (4 samples, 0.04%)core::num::<impl usize>::checked_sub (2 samples, 0.02%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (2 samples, 0.02%)fastwebsockets::WebSocketWrite<S>::write_frame::_{{closure}} (1,998 samples, 17.53%)fastwebsockets::WebSocketWr..fastwebsockets::WriteHalf::write_frame::_{{closure}} (1,907 samples, 16.73%)fastwebsockets::WriteHalf:..fastwebsockets::frame::Frame::writev::_{{closure}} (924 samples, 8.11%)fastwebsock..fastwebsockets::frame::Frame::fmt_head (9 samples, 0.08%)<core::pin::Pin<P> as core::future::future::Future>::poll (2,144 samples, 18.81%)<core::pin::Pin<P> as core::f..wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_split::_{{closure}} (2,144 samples, 18.81%)wisp_mux::fastwebsockets::_<i..wisp_mux::fastwebsockets::<impl core::convert::From<wisp_mux::ws::Frame> for fastwebsockets::frame::Frame>::from (7 samples, 0.06%)wisp_mux::fastwebsockets::match_payload_reverse (5 samples, 0.04%)futures_util::lock::mutex::Mutex<T>::remove_waker (2 samples, 0.02%)<futures_util::lock::mutex::MutexLockFuture<T> as core::future::future::Future>::poll (55 samples, 0.48%)futures_util::lock::mutex::Mutex<T>::try_lock (47 samples, 0.41%)core::sync::atomic::AtomicUsize::fetch_or (47 samples, 0.41%)core::sync::atomic::atomic_or (47 samples, 0.41%)<alloc::boxed::Box<T,A> as core::ops::drop::Drop>::drop (45 samples, 0.39%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (44 samples, 0.39%)alloc::alloc::dealloc (44 samples, 0.39%)__rdl_dealloc (44 samples, 0.39%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (44 samples, 0.39%)cfree (44 samples, 0.39%)[libc.so.6] (28 samples, 0.25%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<(),wisp_mux::WispError>+core::marker::Send>>> (66 samples, 0.58%)core::ptr::drop_in_place<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<(),wisp_mux::WispError>+core::marker::Send>> (66 samples, 0.58%)core::ptr::drop_in_place<wisp_mux::fastwebsockets::<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<tokio_util::either::Either<tokio::net::tcp::split_owned::OwnedWriteHalf,tokio::net::unix::split_owned::OwnedWriteHalf>>>::wisp_write_split::{{closure}}> (6 samples, 0.05%)core::ptr::drop_in_place<futures_util::lock::mutex::MutexGuard<alloc::boxed::Box<dyn wisp_mux::ws::WebSocketWrite+core::marker::Send>>> (51 samples, 0.45%)<futures_util::lock::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (51 samples, 0.45%)futures_util::lock::mutex::Mutex<T>::unlock (51 samples, 0.45%)core::sync::atomic::AtomicUsize::fetch_and (51 samples, 0.45%)core::sync::atomic::atomic_and (51 samples, 0.45%)core::ptr::drop_in_place<futures_util::lock::mutex::MutexLockFuture<alloc::boxed::Box<dyn wisp_mux::ws::WebSocketWrite+core::marker::Send>>> (3 samples, 0.03%)<futures_util::lock::mutex::MutexLockFuture<T> as core::ops::drop::Drop>::drop (3 samples, 0.03%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::poll_flush (2,690 samples, 23.60%)<core::pin::Pin<P> as futures_sink::Si..<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_flush (2,687 samples, 23.57%)<wisp_mux::sink_unfold::Unfold<T,F,R,..wisp_mux::stream::MuxStreamWrite::into_inner_sink::_{{closure}}::_{{closure}} (2,646 samples, 23.21%)wisp_mux::stream::MuxStreamWrite::int..wisp_mux::stream::MuxStreamWrite::write_payload::_{{closure}} (2,640 samples, 23.16%)wisp_mux::stream::MuxStreamWrite::wri..wisp_mux::stream::MuxStreamWrite::write_payload_internal::_{{closure}} (2,490 samples, 21.85%)wisp_mux::stream::MuxStreamWrite::w..wisp_mux::ws::LockedWebSocketWrite::write_split::_{{closure}} (2,436 samples, 21.37%)wisp_mux::ws::LockedWebSocketWrite..wisp_mux::fastwebsockets::<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_split (28 samples, 0.25%)alloc::boxed::Box<T>::pin (25 samples, 0.22%)alloc::boxed::Box<T>::new (25 samples, 0.22%)alloc::alloc::exchange_malloc (20 samples, 0.18%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (20 samples, 0.18%)alloc::alloc::Global::alloc_impl (20 samples, 0.18%)alloc::alloc::alloc (20 samples, 0.18%)__rdl_alloc (20 samples, 0.18%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (20 samples, 0.18%)malloc (17 samples, 0.15%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::poll_flush (2,723 samples, 23.89%)<wisp_mux::stream::MuxStreamIoSink as ..core::task::poll::Poll<core::result::Result<T,E>>::map_err (33 samples, 0.29%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::poll_ready (11 samples, 0.10%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::poll_ready (7 samples, 0.06%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_ready (6 samples, 0.05%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_flush (6 samples, 0.05%)__rdl_alloc (269 samples, 2.36%)__..std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (269 samples, 2.36%)st..malloc (265 samples, 2.32%)m..[libc.so.6] (156 samples, 1.37%)[libc.so.6] (22 samples, 0.19%)alloc::vec::Vec<T,A>::with_capacity_in (274 samples, 2.40%)al..alloc::raw_vec::RawVec<T,A>::with_capacity_in (274 samples, 2.40%)al..alloc::raw_vec::RawVec<T,A>::try_allocate_in (274 samples, 2.40%)al..<alloc::alloc::Global as core::alloc::Allocator>::allocate (274 samples, 2.40%)<a..alloc::alloc::Global::alloc_impl (274 samples, 2.40%)al..alloc::alloc::alloc (274 samples, 2.40%)al..core::ptr::read_volatile (5 samples, 0.04%)alloc::slice::<impl [T]>::to_vec (687 samples, 6.03%)alloc::s..alloc::slice::<impl [T]>::to_vec_in (687 samples, 6.03%)alloc::s..alloc::slice::hack::to_vec (687 samples, 6.03%)alloc::s..<T as alloc::slice::hack::ConvertVec>::to_vec (687 samples, 6.03%)<T as al..core::ptr::const_ptr::<impl *const T>::copy_to_nonoverlapping (413 samples, 3.62%)core..core::intrinsics::copy_nonoverlapping (413 samples, 3.62%)core..[libc.so.6] (413 samples, 3.62%)[lib..<bytes::bytes_mut::BytesMut as core::convert::From<&[u8]>>::from (693 samples, 6.08%)<bytes::..bytes::bytes_mut::BytesMut::from_vec (6 samples, 0.05%)bytes::bytes_mut::original_capacity_to_repr (4 samples, 0.04%)[libc.so.6] (41 samples, 0.36%)core::pin::Pin<Ptr>::set (52 samples, 0.46%)core::ptr::drop_in_place<wisp_mux::sink_unfold::UnfoldState<wisp_mux::stream::MuxStreamWrite,wisp_mux::stream::MuxStreamWrite::into_inner_sink::{{closure}}::{{closure}}>> (10 samples, 0.09%)core::ptr::drop_in_place<pin_project_lite::__private::UnsafeOverwriteGuard<wisp_mux::sink_unfold::UnfoldState<wisp_mux::stream::MuxStreamWrite,wisp_mux::stream::MuxStreamWrite::into_inner_sink::{{closure}}::{{closure}}>>> (5 samples, 0.04%)<pin_project_lite::__private::UnsafeOverwriteGuard<T> as core::ops::drop::Drop>::drop (5 samples, 0.04%)core::ptr::write (5 samples, 0.04%)wisp_mux::sink_unfold::UnfoldState<T,Fut>::take_value (14 samples, 0.12%)wisp_mux::sink_unfold::_::<impl wisp_mux::sink_unfold::UnfoldState<T,Fut>>::project_replace (6 samples, 0.05%)<core::pin::Pin<P> as futures_sink::Sink<Item>>::start_send (252 samples, 2.21%)<..<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::start_send (249 samples, 2.18%)<..wisp_mux::stream::MuxStreamWrite::into_inner_sink::_{{closure}} (183 samples, 1.61%)<wisp_mux::stream::MuxStreamIoSink as futures_sink::Sink<&[u8]>>::start_send (946 samples, 8.30%)<wisp_mux::s..tokio::io::util::copy::CopyBuffer::poll_write_buf (3,692 samples, 32.39%)tokio::io::util::copy::CopyBuffer::poll_write_buf<tokio_util::compat::Compat<T> as tokio::io::async_write::AsyncWrite>::poll_write (3,685 samples, 32.33%)<tokio_util::compat::Compat<T> as tokio::io::async_w..<wisp_mux::stream::MuxStreamAsyncWrite as futures_io::if_std::AsyncWrite>::poll_write (3,685 samples, 32.33%)<wisp_mux::stream::MuxStreamAsyncWrite as futures_io..tokio::io::util::copy::copy::_{{closure}} (4,263 samples, 37.40%)tokio::io::util::copy::copy::_{{closure}}<tokio::io::util::copy::Copy<R,W> as core::future::future::Future>::poll (4,260 samples, 37.37%)<tokio::io::util::copy::Copy<R,W> as core::future::future::Fu..tokio::io::util::copy::CopyBuffer::poll_copy (4,260 samples, 37.37%)tokio::io::util::copy::CopyBuffer::poll_copytokio::runtime::coop::poll_proceed (3 samples, 0.03%)tokio::runtime::context::budget (3 samples, 0.03%)std::thread::local::LocalKey<T>::try_with (3 samples, 0.03%)tokio::runtime::context::budget::_{{closure}} (2 samples, 0.02%)tokio::runtime::coop::poll_proceed::_{{closure}} (2 samples, 0.02%)epoxy_server::handle_stream::_{{closure}}::_{{closure}} (5,286 samples, 46.38%)epoxy_server::handle_stream::_{{closure}}::_{{closure}}<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (5,285 samples, 46.37%)<tokio::future::poll_fn::PollFn<F> as core::future::future::Future>::pollepoxy_server::handle_stream::_{{closure}}::_{{closure}}::_{{closure}} (5,285 samples, 46.37%)epoxy_server::handle_stream::_{{closure}}::_{{closure}}::_{{closure}}tokio::macros::support::thread_rng_n (4 samples, 0.04%)tokio::runtime::context::thread_rng_n (4 samples, 0.04%)std::thread::local::LocalKey<T>::with (4 samples, 0.04%)std::thread::local::LocalKey<T>::try_with (4 samples, 0.04%)core::ops::function::FnOnce::call_once (4 samples, 0.04%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (4 samples, 0.04%)std::sys::thread_local::native::eager::Storage<T>::get (4 samples, 0.04%)epoxy_server::handle_stream::_{{closure}} (5,292 samples, 46.43%)epoxy_server::handle_stream::_{{closure}}epoxy_server::stream::ClientStream::connect::_{{closure}} (5 samples, 0.04%)tokio::net::tcp::stream::TcpStream::connect::_{{closure}} (5 samples, 0.04%)tokio::net::tcp::stream::TcpStream::connect_addr::_{{closure}} (5 samples, 0.04%)mio::net::tcp::stream::TcpStream::connect (5 samples, 0.04%)mio::sys::unix::tcp::connect (5 samples, 0.04%)connect (5 samples, 0.04%)<core::pin::Pin<P> as futures_core::future::FusedFuture>::is_terminated (5 samples, 0.04%)<futures_util::future::future::fuse::Fuse<Fut> as futures_core::future::FusedFuture>::is_terminated (2 samples, 0.02%)core::option::Option<T>::is_none (2 samples, 0.02%)core::option::Option<T>::is_some (2 samples, 0.02%)<T as core::convert::Into<U>>::into (2 samples, 0.02%)wisp_mux::fastwebsockets::<impl core::convert::From<fastwebsockets::frame::OpCode> for wisp_mux::ws::OpCode>::from (2 samples, 0.02%)<T as core::convert::Into<U>>::into (6 samples, 0.05%)wisp_mux::fastwebsockets::<impl core::convert::From<fastwebsockets::frame::Frame> for wisp_mux::ws::Frame>::from (6 samples, 0.05%)wisp_mux::fastwebsockets::match_payload (4 samples, 0.04%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_impl::Buf>::advance (2 samples, 0.02%)bytes::bytes_mut::BytesMut::advance_unchecked (2 samples, 0.02%)<&mut T as bytes::buf::buf_mut::BufMut>::advance_mut (6 samples, 0.05%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_mut::BufMut>::advance_mut (6 samples, 0.05%)bytes::bytes_mut::BytesMut::len (3 samples, 0.03%)[libc.so.6] (43 samples, 0.38%)recv (93 samples, 0.82%)[unknown] (11 samples, 0.10%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read (103 samples, 0.90%)mio::io_source::IoSource<T>::do_io (103 samples, 0.90%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (103 samples, 0.90%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read::_{{closure}} (103 samples, 0.90%)<&std::net::tcp::TcpStream as std::io::Read>::read (103 samples, 0.90%)std::sys_common::net::TcpStream::read (103 samples, 0.90%)std::sys::pal::unix::net::Socket::read (103 samples, 0.90%)std::sys::pal::unix::net::Socket::recv_with_flags (103 samples, 0.90%)std::sys::pal::unix::cvt (10 samples, 0.09%)<isize as std::sys::pal::unix::IsMinusOne>::is_minus_one (7 samples, 0.06%)tokio::io::read_buf::ReadBuf::assume_init (2 samples, 0.02%)core::sync::atomic::AtomicUsize::compare_exchange (23 samples, 0.20%)core::sync::atomic::atomic_compare_exchange (23 samples, 0.20%)tokio::runtime::io::registration::Registration::clear_readiness (33 samples, 0.29%)tokio::runtime::io::scheduled_io::ScheduledIo::clear_readiness (33 samples, 0.29%)tokio::runtime::io::scheduled_io::ScheduledIo::set_readiness (33 samples, 0.29%)core::sync::atomic::AtomicUsize::load (9 samples, 0.08%)core::sync::atomic::atomic_load (9 samples, 0.08%)core::ops::function::FnOnce::call_once (2 samples, 0.02%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (2 samples, 0.02%)std::sys::thread_local::native::eager::Storage<T>::get (2 samples, 0.02%)core::cell::Cell<T>::get (2 samples, 0.02%)tokio::runtime::coop::poll_proceed (3 samples, 0.03%)tokio::runtime::context::budget (3 samples, 0.03%)std::thread::local::LocalKey<T>::try_with (3 samples, 0.03%)<core::task::wake::Waker as core::clone::Clone>::clone (9 samples, 0.08%)tokio::runtime::task::waker::clone_waker (9 samples, 0.08%)tokio::runtime::task::state::State::ref_inc (9 samples, 0.08%)core::sync::atomic::AtomicUsize::fetch_add (9 samples, 0.08%)core::sync::atomic::atomic_add (9 samples, 0.08%)core::ptr::drop_in_place<tokio::loom::std::parking_lot::MutexGuard<tokio::runtime::io::scheduled_io::Waiters>> (3 samples, 0.03%)core::ptr::drop_in_place<lock_api::mutex::MutexGuard<parking_lot::raw_mutex::RawMutex,tokio::runtime::io::scheduled_io::Waiters>> (3 samples, 0.03%)<lock_api::mutex::MutexGuard<R,T> as core::ops::drop::Drop>::drop (3 samples, 0.03%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::unlock (3 samples, 0.03%)core::sync::atomic::AtomicU8::compare_exchange (3 samples, 0.03%)core::sync::atomic::atomic_compare_exchange (3 samples, 0.03%)core::sync::atomic::AtomicUsize::load (16 samples, 0.14%)core::sync::atomic::atomic_load (16 samples, 0.14%)tokio::loom::std::parking_lot::Mutex<T>::lock (4 samples, 0.04%)lock_api::mutex::Mutex<R,T>::lock (4 samples, 0.04%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::lock (4 samples, 0.04%)core::sync::atomic::AtomicU8::compare_exchange_weak (4 samples, 0.04%)core::sync::atomic::atomic_compare_exchange_weak (4 samples, 0.04%)<&mut T as tokio::io::async_read::AsyncRead>::poll_read (195 samples, 1.71%)<tokio_util::either::Either<L,R> as tokio::io::async_read::AsyncRead>::poll_read (194 samples, 1.70%)tokio::net::tcp::stream::TcpStream::poll_read_priv (187 samples, 1.64%)tokio::io::poll_evented::PollEvented<E>::poll_read (185 samples, 1.62%)tokio::runtime::io::registration::Registration::poll_read_ready (42 samples, 0.37%)tokio::runtime::io::registration::Registration::poll_ready (41 samples, 0.36%)tokio::runtime::io::scheduled_io::ScheduledIo::poll_readiness (36 samples, 0.32%)<tokio::io::util::read_buf::ReadBuf<R,B> as core::future::future::Future>::poll (205 samples, 1.80%)<..tokio::io::read_buf::ReadBuf::filled (2 samples, 0.02%)bytes::buf::buf_impl::Buf::get_u16 (2 samples, 0.02%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_impl::Buf>::advance (2 samples, 0.02%)bytes::bytes_mut::BytesMut::advance_unchecked (2 samples, 0.02%)alloc::vec::Vec<T,A>::extend_from_slice (602 samples, 5.28%)alloc:..<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<&T,core::slice::iter::Iter<T>>>::spec_extend (602 samples, 5.28%)<alloc..alloc::vec::Vec<T,A>::append_elements (602 samples, 5.28%)alloc:..core::intrinsics::copy_nonoverlapping (602 samples, 5.28%)core::..[libc.so.6] (601 samples, 5.27%)[libc...[libc.so.6] (68 samples, 0.60%)[libc.so.6] (63 samples, 0.55%)<alloc::alloc::Global as core::alloc::Allocator>::grow (76 samples, 0.67%)alloc::alloc::Global::grow_impl (76 samples, 0.67%)alloc::alloc::realloc (76 samples, 0.67%)__rdl_realloc (76 samples, 0.67%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::realloc (76 samples, 0.67%)realloc (76 samples, 0.67%)alloc::vec::Vec<T,A>::reserve (77 samples, 0.68%)alloc::raw_vec::RawVec<T,A>::reserve (77 samples, 0.68%)alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (77 samples, 0.68%)alloc::raw_vec::RawVec<T,A>::grow_amortized (77 samples, 0.68%)alloc::raw_vec::finish_grow (77 samples, 0.68%)[libc.so.6] (63 samples, 0.55%)[libc.so.6] (26 samples, 0.23%)__mprotect (9 samples, 0.08%)__rdl_alloc (80 samples, 0.70%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (80 samples, 0.70%)malloc (80 samples, 0.70%)alloc::vec::Vec<T>::with_capacity (81 samples, 0.71%)alloc::vec::Vec<T,A>::with_capacity_in (81 samples, 0.71%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (81 samples, 0.71%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (81 samples, 0.71%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (81 samples, 0.71%)alloc::alloc::Global::alloc_impl (81 samples, 0.71%)alloc::alloc::alloc (81 samples, 0.71%)bytes::bytes_mut::Shared::is_unique (3 samples, 0.03%)core::sync::atomic::AtomicUsize::load (3 samples, 0.03%)core::sync::atomic::atomic_load (3 samples, 0.03%)bytes::bytes_mut::release_shared (97 samples, 0.85%)core::sync::atomic::AtomicUsize::fetch_sub (96 samples, 0.84%)core::sync::atomic::atomic_sub (96 samples, 0.84%)bytes::bytes_mut::BytesMut::reserve (1,156 samples, 10.14%)bytes::bytes_mu..bytes::bytes_mut::BytesMut::reserve_inner (1,155 samples, 10.13%)bytes::bytes_mu..core::intrinsics::copy_nonoverlapping (292 samples, 2.56%)co..[libc.so.6] (292 samples, 2.56%)[l..__rdl_alloc (45 samples, 0.39%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (45 samples, 0.39%)malloc (45 samples, 0.39%)[libc.so.6] (25 samples, 0.22%)bytes::bytes_mut::BytesMut::promote_to_shared (49 samples, 0.43%)alloc::boxed::Box<T>::new (48 samples, 0.42%)alloc::alloc::exchange_malloc (47 samples, 0.41%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (47 samples, 0.41%)alloc::alloc::Global::alloc_impl (47 samples, 0.41%)alloc::alloc::alloc (47 samples, 0.41%)core::ptr::read_volatile (2 samples, 0.02%)fastwebsockets::ReadHalf::parse_frame_header::_{{closure}} (1,490 samples, 13.07%)fastwebsockets::Read..bytes::bytes_mut::BytesMut::split_to (81 samples, 0.71%)bytes::bytes_mut::BytesMut::shallow_clone (79 samples, 0.69%)bytes::bytes_mut::increment_shared (28 samples, 0.25%)core::sync::atomic::AtomicUsize::fetch_add (28 samples, 0.25%)core::sync::atomic::atomic_add (28 samples, 0.25%)fastwebsockets::frame::Payload::to_mut (4 samples, 0.04%)<core::slice::iter::IterMut<T> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.04%)<core::ptr::non_null::NonNull<T> as core::cmp::PartialEq>::eq (2 samples, 0.02%)core::ptr::align_offset (4 samples, 0.04%)core::slice::<impl [T]>::align_to_mut (7 samples, 0.06%)core::slice::<impl [T]>::align_to_offsets (3 samples, 0.03%)fastwebsockets::ReadHalf::read_frame_inner::_{{closure}} (2,058 samples, 18.06%)fastwebsockets::ReadHalf::re..fastwebsockets::frame::Frame::unmask (555 samples, 4.87%)fastwe..fastwebsockets::mask::unmask (551 samples, 4.83%)fastwe..fastwebsockets::mask::unmask_fallback (551 samples, 4.83%)fastwe..fastwebsockets::mask::unmask_easy (5 samples, 0.04%)core::iter::traits::iterator::Iterator::for_each (5 samples, 0.04%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold (5 samples, 0.04%)<core::slice::iter::IterMut<T> as core::iter::traits::iterator::Iterator>::fold (5 samples, 0.04%)<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::_{{closure}} (4 samples, 0.04%)core::iter::traits::iterator::Iterator::for_each::call::_{{closure}} (4 samples, 0.04%)fastwebsockets::mask::unmask_easy::_{{closure}} (4 samples, 0.04%)<fastwebsockets::frame::Payload as core::ops::deref::Deref>::deref (5 samples, 0.04%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_mut::BufMut>::advance_mut (3 samples, 0.03%)__rdl_alloc (50 samples, 0.44%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (50 samples, 0.44%)malloc (50 samples, 0.44%)[libc.so.6] (35 samples, 0.31%)[libc.so.6] (10 samples, 0.09%)alloc::vec::Vec<T>::with_capacity (51 samples, 0.45%)alloc::vec::Vec<T,A>::with_capacity_in (51 samples, 0.45%)alloc::raw_vec::RawVec<T,A>::with_capacity_in (51 samples, 0.45%)alloc::raw_vec::RawVec<T,A>::try_allocate_in (51 samples, 0.45%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (51 samples, 0.45%)alloc::alloc::Global::alloc_impl (51 samples, 0.45%)alloc::alloc::alloc (51 samples, 0.45%)bytes::bytes_mut::BytesMut::reserve (56 samples, 0.49%)bytes::bytes_mut::BytesMut::reserve_inner (56 samples, 0.49%)bytes::bytes_mut::release_shared (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_sub (2 samples, 0.02%)core::sync::atomic::atomic_sub (2 samples, 0.02%)bytes::bytes_mut::BytesMut::extend_from_slice (1,004 samples, 8.81%)bytes::bytes..core::intrinsics::copy_nonoverlapping (945 samples, 8.29%)core::intrin..[libc.so.6] (945 samples, 8.29%)[libc.so.6]core::option::Option<T>::take (2 samples, 0.02%)core::mem::replace (2 samples, 0.02%)core::ptr::read (2 samples, 0.02%)core::option::Option<T>::unwrap (2 samples, 0.02%)<core::pin::Pin<P> as core::future::future::Future>::poll (3,299 samples, 28.94%)<core::pin::Pin<P> as core::future::future::Fut..wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketRead for fastwebsockets::fragment::FragmentCollectorRead<S>>::wisp_read_frame::_{{closure}} (3,299 samples, 28.94%)wisp_mux::fastwebsockets::_<impl wisp_mux::ws::..fastwebsockets::fragment::FragmentCollectorRead<S>::read_frame::_{{closure}} (3,269 samples, 28.68%)fastwebsockets::fragment::FragmentCollectorRea..fastwebsockets::fragment::Fragments::accumulate (1,187 samples, 10.41%)fastwebsockets:..core::ptr::drop_in_place<fastwebsockets::frame::Payload> (159 samples, 1.39%)core::ptr::drop_in_place<bytes::bytes_mut::BytesMut> (159 samples, 1.39%)<bytes::bytes_mut::BytesMut as core::ops::drop::Drop>::drop (159 samples, 1.39%)bytes::bytes_mut::release_shared (159 samples, 1.39%)core::sync::atomic::AtomicUsize::fetch_sub (156 samples, 1.37%)core::sync::atomic::atomic_sub (156 samples, 1.37%)<alloc::boxed::Box<T,A> as core::ops::drop::Drop>::drop (17 samples, 0.15%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (17 samples, 0.15%)alloc::alloc::dealloc (17 samples, 0.15%)__rdl_dealloc (17 samples, 0.15%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (17 samples, 0.15%)cfree (17 samples, 0.15%)[libc.so.6] (9 samples, 0.08%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>>> (23 samples, 0.20%)core::ptr::drop_in_place<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>> (23 samples, 0.20%)<core::pin::Pin<P> as core::future::future::Future>::poll (3,335 samples, 29.26%)<core::pin::Pin<P> as core::future::future::Fut..<wisp_mux::ws::AppendingWebSocketRead<R> as wisp_mux::ws::WebSocketRead>::wisp_read_frame::_{{closure}} (3,335 samples, 29.26%)<wisp_mux::ws::AppendingWebSocketRead<R> as wis..wisp_mux::fastwebsockets::<impl wisp_mux::ws::WebSocketRead for fastwebsockets::fragment::FragmentCollectorRead<S>>::wisp_read_frame (2 samples, 0.02%)alloc::boxed::Box<T>::pin (2 samples, 0.02%)alloc::boxed::Box<T>::new (2 samples, 0.02%)alloc::alloc::exchange_malloc (2 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.02%)alloc::alloc::Global::alloc_impl (2 samples, 0.02%)alloc::alloc::alloc (2 samples, 0.02%)__rdl_alloc (2 samples, 0.02%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::alloc (2 samples, 0.02%)malloc (2 samples, 0.02%)<wisp_mux::packet::StreamType as core::cmp::PartialEq>::eq (2 samples, 0.02%)<wisp_mux::ws::AppendingWebSocketRead<R> as wisp_mux::ws::WebSocketRead>::wisp_read_frame (2 samples, 0.02%)alloc::boxed::Box<T>::pin (2 samples, 0.02%)alloc::boxed::Box<T>::new (2 samples, 0.02%)alloc::alloc::exchange_malloc (2 samples, 0.02%)<alloc::alloc::Global as core::alloc::Allocator>::allocate (2 samples, 0.02%)alloc::alloc::Global::alloc_impl (2 samples, 0.02%)alloc::alloc::alloc (2 samples, 0.02%)bytes::bytes_mut::BytesMut::freeze (4 samples, 0.04%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>>> (16 samples, 0.14%)core::ptr::drop_in_place<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>> (16 samples, 0.14%)<alloc::boxed::Box<T,A> as core::ops::drop::Drop>::drop (12 samples, 0.11%)<alloc::alloc::Global as core::alloc::Allocator>::deallocate (12 samples, 0.11%)alloc::alloc::dealloc (12 samples, 0.11%)__rdl_dealloc (12 samples, 0.11%)std::sys::pal::unix::alloc::<impl core::alloc::global::GlobalAlloc for std::alloc::System>::dealloc (12 samples, 0.11%)cfree (12 samples, 0.11%)[libc.so.6] (2 samples, 0.02%)core::ptr::drop_in_place<dashmap::mapref::one::Ref<u32,wisp_mux::MuxMapValue>> (6 samples, 0.05%)core::ptr::drop_in_place<lock_api::rwlock::RwLockReadGuard<dashmap::lock::RawRwLock,hashbrown::map::HashMap<u32,dashmap::util::SharedValue<wisp_mux::MuxMapValue>,std::hash::random::RandomState>>> (6 samples, 0.05%)<lock_api::rwlock::RwLockReadGuard<R,T> as core::ops::drop::Drop>::drop (6 samples, 0.05%)<dashmap::lock::RawRwLock as lock_api::rwlock::RawRwLock>::unlock_shared (6 samples, 0.05%)core::sync::atomic::AtomicUsize::fetch_sub (6 samples, 0.05%)core::sync::atomic::atomic_sub (6 samples, 0.05%)core::sync::atomic::AtomicU32::load (3 samples, 0.03%)core::sync::atomic::atomic_load (3 samples, 0.03%)core::sync::atomic::AtomicUsize::compare_exchange_weak (8 samples, 0.07%)core::sync::atomic::atomic_compare_exchange_weak (8 samples, 0.07%)<dashmap::DashMap<K,V,S> as dashmap::t::Map<K,V,S>>::_yield_read_shard (13 samples, 0.11%)lock_api::rwlock::RwLock<R,T>::read (13 samples, 0.11%)<dashmap::lock::RawRwLock as lock_api::rwlock::RawRwLock>::lock_shared (13 samples, 0.11%)dashmap::lock::RawRwLock::try_lock_shared_fast (13 samples, 0.11%)core::sync::atomic::AtomicUsize::load (5 samples, 0.04%)core::sync::atomic::atomic_load (5 samples, 0.04%)<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (2 samples, 0.02%)core::num::<impl u64>::rotate_left (2 samples, 0.02%)<std::hash::random::DefaultHasher as core::hash::Hasher>::finish (3 samples, 0.03%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (3 samples, 0.03%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (3 samples, 0.03%)<std::hash::random::RandomState as core::hash::BuildHasher>::build_hasher (2 samples, 0.02%)core::hash::sip::SipHasher13::new_with_keys (2 samples, 0.02%)core::hash::sip::Hasher<S>::new_with_keys (2 samples, 0.02%)core::hash::sip::Hasher<S>::reset (2 samples, 0.02%)dashmap::DashMap<K,V,S>::hash_usize (8 samples, 0.07%)core::hash::impls::<impl core::hash::Hash for &T>::hash (3 samples, 0.03%)core::hash::impls::<impl core::hash::Hash for u32>::hash (3 samples, 0.03%)core::hash::Hasher::write_u32 (3 samples, 0.03%)<std::hash::random::DefaultHasher as core::hash::Hasher>::write (3 samples, 0.03%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (3 samples, 0.03%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (3 samples, 0.03%)<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (3 samples, 0.03%)core::num::<impl u64>::wrapping_add (2 samples, 0.02%)<std::hash::random::DefaultHasher as core::hash::Hasher>::finish (6 samples, 0.05%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (6 samples, 0.05%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (6 samples, 0.05%)<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::d_rounds (3 samples, 0.03%)core::num::<impl u64>::wrapping_add (2 samples, 0.02%)hashbrown::map::make_hash (9 samples, 0.08%)core::hash::impls::<impl core::hash::Hash for u32>::hash (2 samples, 0.02%)core::hash::Hasher::write_u32 (2 samples, 0.02%)<std::hash::random::DefaultHasher as core::hash::Hasher>::write (2 samples, 0.02%)<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (2 samples, 0.02%)<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.02%)hashbrown::raw::inner::sse2::Group::load (3 samples, 0.03%)core::core_arch::x86::sse2::_mm_loadu_si128 (3 samples, 0.03%)core::intrinsics::copy_nonoverlapping (3 samples, 0.03%)dashmap::DashMap<K,V,S>::get (40 samples, 0.35%)<dashmap::DashMap<K,V,S> as dashmap::t::Map<K,V,S>>::_get (40 samples, 0.35%)hashbrown::map::HashMap<K,V,S,A>::get_key_value (19 samples, 0.17%)hashbrown::map::HashMap<K,V,S,A>::get_inner (19 samples, 0.17%)hashbrown::raw::inner::RawTable<T,A>::get (10 samples, 0.09%)hashbrown::raw::inner::RawTable<T,A>::find (10 samples, 0.09%)hashbrown::raw::inner::RawTableInner::find_inner (10 samples, 0.09%)hashbrown::raw::inner::sse2::Group::match_byte (2 samples, 0.02%)core::core_arch::x86::sse2::_mm_movemask_epi8 (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::pop_front (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::buffer_read (2 samples, 0.02%)core::ptr::read (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::buffer_write (2 samples, 0.02%)core::ptr::write (2 samples, 0.02%)alloc::collections::vec_deque::VecDeque<T,A>::push_back (4 samples, 0.04%)core::option::Option<T>::map (3 samples, 0.03%)flume::Shared<T>::send::_{{closure}} (3 samples, 0.03%)flume::Hook<T,S>::fire_send (2 samples, 0.02%)core::ptr::drop_in_place<core::option::Option<alloc::sync::Arc<flume::Hook<bytes::bytes::Bytes,dyn flume::signal::Signal>>>> (2 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<flume::Hook<bytes::bytes::Bytes,dyn flume::signal::Signal>>> (2 samples, 0.02%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_sub (2 samples, 0.02%)core::sync::atomic::atomic_sub (2 samples, 0.02%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<flume::Chan<bytes::bytes::Bytes>>> (15 samples, 0.13%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (15 samples, 0.13%)std::sys::sync::mutex::futex::Mutex::unlock (15 samples, 0.13%)core::sync::atomic::AtomicU32::swap (14 samples, 0.12%)core::sync::atomic::atomic_swap (14 samples, 0.12%)flume::Sender<T>::try_send (58 samples, 0.51%)flume::Shared<T>::send_sync (58 samples, 0.51%)flume::Shared<T>::send (58 samples, 0.51%)flume::wait_lock (28 samples, 0.25%)std::sync::mutex::Mutex<T>::lock (28 samples, 0.25%)std::sys::sync::mutex::futex::Mutex::lock (28 samples, 0.25%)core::sync::atomic::AtomicU32::compare_exchange (28 samples, 0.25%)core::sync::atomic::atomic_compare_exchange (28 samples, 0.25%)bytes::buf::buf_impl::Buf::get_u32_le (4 samples, 0.04%)<wisp_mux::ws::Payload as bytes::buf::buf_impl::Buf>::advance (2 samples, 0.02%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_impl::Buf>::advance (2 samples, 0.02%)bytes::bytes_mut::BytesMut::advance_unchecked (2 samples, 0.02%)wisp_mux::MuxInner::server_loop::_{{closure}} (3,550 samples, 31.15%)wisp_mux::MuxInner::server_loop::_{{closure}}wisp_mux::packet::Packet::maybe_handle_extension::_{{closure}} (21 samples, 0.18%)bytes::buf::buf_impl::Buf::get_u8 (7 samples, 0.06%)<wisp_mux::ws::Payload as bytes::buf::buf_impl::Buf>::advance (5 samples, 0.04%)<bytes::bytes_mut::BytesMut as bytes::buf::buf_impl::Buf>::advance (5 samples, 0.04%)bytes::bytes_mut::BytesMut::advance_unchecked (4 samples, 0.04%)core::option::Option<T>::map (2 samples, 0.02%)core::ops::function::FnOnce::call_once (2 samples, 0.02%)<alloc::sync::Arc<T,A> as core::clone::Clone>::clone (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_add (2 samples, 0.02%)core::sync::atomic::atomic_add (2 samples, 0.02%)core::ptr::drop_in_place<alloc::sync::Arc<flume::Hook<wisp_mux::stream::WsEvent,flume::async::AsyncSignal>>> (2 samples, 0.02%)<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.02%)core::sync::atomic::AtomicUsize::fetch_sub (2 samples, 0.02%)core::sync::atomic::atomic_sub (2 samples, 0.02%)std::sync::poison::Flag::done (2 samples, 0.02%)core::mem::drop (11 samples, 0.10%)core::ptr::drop_in_place<std::sync::mutex::MutexGuard<flume::Chan<wisp_mux::stream::WsEvent>>> (11 samples, 0.10%)<std::sync::mutex::MutexGuard<T> as core::ops::drop::Drop>::drop (11 samples, 0.10%)std::sys::sync::mutex::futex::Mutex::unlock (9 samples, 0.08%)core::sync::atomic::AtomicU32::swap (9 samples, 0.08%)core::sync::atomic::atomic_swap (9 samples, 0.08%)flume::Shared<T>::recv_sync (22 samples, 0.19%)flume::Shared<T>::recv (22 samples, 0.19%)flume::wait_lock (11 samples, 0.10%)std::sync::mutex::Mutex<T>::lock (11 samples, 0.10%)std::sys::sync::mutex::futex::Mutex::lock (11 samples, 0.10%)core::sync::atomic::AtomicU32::compare_exchange (10 samples, 0.09%)core::sync::atomic::atomic_compare_exchange (10 samples, 0.09%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (3,596 samples, 31.55%)core::ops::function::impls::<impl core::ops::functi..wisp_mux::MuxInner::as_future::_{{closure}}::_{{closure}}::_{{closure}} (3,596 samples, 31.55%)wisp_mux::MuxInner::as_future::_{{closure}}::_{{clo..futures_util::future::future::FutureExt::poll_unpin (3,587 samples, 31.47%)futures_util::future::future::FutureExt::poll_unpin<core::pin::Pin<P> as core::future::future::Future>::poll (3,587 samples, 31.47%)<core::pin::Pin<P> as core::future::future::Future>..<futures_util::future::future::fuse::Fuse<Fut> as core::future::future::Future>::poll (3,587 samples, 31.47%)<futures_util::future::future::fuse::Fuse<Fut> as c..wisp_mux::MuxInner::stream_loop::_{{closure}} (37 samples, 0.32%)<flume::async::RecvFut<T> as core::future::future::Future>::poll (35 samples, 0.31%)flume::async::RecvFut<T>::poll_inner (35 samples, 0.31%)flume::async::<impl flume::Hook<T,flume::async::AsyncSignal>>::update_waker (9 samples, 0.08%)spin::mutex::Mutex<T,R>::lock (8 samples, 0.07%)spin::mutex::spin::SpinMutex<T,R>::lock (8 samples, 0.07%)core::sync::atomic::AtomicBool::compare_exchange_weak (7 samples, 0.06%)core::sync::atomic::atomic_compare_exchange_weak (7 samples, 0.06%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll::_{{closure}} (8,906 samples, 78.14%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll::_{{closure}}wisp_mux::MuxInner::server_into_future::_{{closure}} (3,614 samples, 31.71%)wisp_mux::MuxInner::server_into_future::_{{closure}}wisp_mux::MuxInner::as_future::_{{closure}} (3,613 samples, 31.70%)wisp_mux::MuxInner::as_future::_{{closure}}<futures_util::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (3,605 samples, 31.63%)<futures_util::future::poll_fn::PollFn<F> as core::..wisp_mux::MuxInner::as_future::_{{closure}}::_{{closure}} (3,605 samples, 31.63%)wisp_mux::MuxInner::as_future::_{{closure}}::_{{clo..futures_util::async_await::random::shuffle (3 samples, 0.03%)core::slice::<impl [T]>::swap (3 samples, 0.03%)core::ptr::swap (3 samples, 0.03%)core::intrinsics::copy_nonoverlapping (3 samples, 0.03%)core::ptr::drop_in_place<core::result::Result<tokio::runtime::coop::with_budget::ResetGuard,std::thread::local::AccessError>> (2 samples, 0.02%)core::ptr::drop_in_place<tokio::runtime::coop::with_budget::ResetGuard> (2 samples, 0.02%)<tokio::runtime::coop::with_budget::ResetGuard as core::ops::drop::Drop>::drop (2 samples, 0.02%)tokio::runtime::context::budget (2 samples, 0.02%)std::thread::local::LocalKey<T>::try_with (2 samples, 0.02%)tokio::runtime::context::budget::_{{closure}} (2 samples, 0.02%)<tokio::runtime::coop::with_budget::ResetGuard as core::ops::drop::Drop>::drop::_{{closure}} (2 samples, 0.02%)core::cell::Cell<T>::set (2 samples, 0.02%)core::cell::Cell<T>::replace (2 samples, 0.02%)core::mem::replace (2 samples, 0.02%)core::ptr::write (2 samples, 0.02%)core::ops::function::FnOnce::call_once (3 samples, 0.03%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (3 samples, 0.03%)std::sys::thread_local::native::eager::Storage<T>::get (3 samples, 0.03%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll (8,913 samples, 78.20%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::polltokio::runtime::coop::with_unconstrained (8,913 samples, 78.20%)tokio::runtime::coop::with_unconstrainedtokio::runtime::coop::with_budget (8,913 samples, 78.20%)tokio::runtime::coop::with_budgettokio::runtime::context::budget (5 samples, 0.04%)std::thread::local::LocalKey<T>::try_with (5 samples, 0.04%)tokio::runtime::context::budget::_{{closure}} (2 samples, 0.02%)tokio::runtime::coop::with_budget::_{{closure}} (2 samples, 0.02%)core::cell::Cell<T>::get (2 samples, 0.02%)core::ptr::drop_in_place<tokio::runtime::task::core::TaskIdGuard> (7 samples, 0.06%)<tokio::runtime::task::core::TaskIdGuard as core::ops::drop::Drop>::drop (7 samples, 0.06%)tokio::runtime::context::set_current_task_id (7 samples, 0.06%)std::thread::local::LocalKey<T>::try_with (7 samples, 0.06%)core::ops::function::FnOnce::call_once (7 samples, 0.06%)tokio::runtime::context::CONTEXT::_{{constant}}::_{{closure}} (7 samples, 0.06%)std::sys::thread_local::native::eager::Storage<T>::get (7 samples, 0.06%)core::cell::Cell<T>::get (7 samples, 0.06%)tokio::runtime::task::harness::poll_future (8,921 samples, 78.27%)tokio::runtime::task::harness::poll_futurestd::panic::catch_unwind (8,921 samples, 78.27%)std::panic::catch_unwindstd::panicking::try (8,921 samples, 78.27%)std::panicking::trystd::panicking::try::do_call (8,921 samples, 78.27%)std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (8,921 samples, 78.27%)<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_oncetokio::runtime::task::harness::poll_future::_{{closure}} (8,921 samples, 78.27%)tokio::runtime::task::harness::poll_future::_{{closure}}tokio::runtime::task::core::Core<T,S>::poll (8,921 samples, 78.27%)tokio::runtime::task::core::Core<T,S>::polltokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut (8,921 samples, 78.27%)tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_muttokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (8,921 samples, 78.27%)tokio::runtime::task::core::Core<T,S>::poll::_{{closure}}core::sync::atomic::AtomicUsize::compare_exchange (5 samples, 0.04%)core::sync::atomic::atomic_compare_exchange (5 samples, 0.04%)tokio::runtime::task::state::State::load (2 samples, 0.02%)core::sync::atomic::AtomicUsize::load (2 samples, 0.02%)core::sync::atomic::atomic_load (2 samples, 0.02%)tokio::runtime::task::state::State::transition_to_idle (14 samples, 0.12%)tokio::runtime::task::state::State::fetch_update_action (14 samples, 0.12%)tokio::runtime::task::state::State::transition_to_idle::_{{closure}} (5 samples, 0.04%)core::sync::atomic::AtomicUsize::compare_exchange (2 samples, 0.02%)core::sync::atomic::atomic_compare_exchange (2 samples, 0.02%)tokio::runtime::task::state::State::transition_to_running (4 samples, 0.04%)tokio::runtime::task::state::State::fetch_update_action (4 samples, 0.04%)tokio::runtime::coop::budget (9,003 samples, 78.99%)tokio::runtime::coop::budgettokio::runtime::coop::with_budget (9,003 samples, 78.99%)tokio::runtime::coop::with_budgettokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}} (8,999 samples, 78.95%)tokio::runtime::scheduler::multi_thread::worker::Context::run_task::_{{closure}}tokio::runtime::task::LocalNotified<S>::run (8,981 samples, 78.79%)tokio::runtime::task::LocalNotified<S>::runtokio::runtime::task::raw::RawTask::poll (8,981 samples, 78.79%)tokio::runtime::task::raw::RawTask::polltokio::runtime::task::raw::poll (8,981 samples, 78.79%)tokio::runtime::task::raw::polltokio::runtime::task::harness::Harness<T,S>::poll (8,981 samples, 78.79%)tokio::runtime::task::harness::Harness<T,S>::polltokio::runtime::task::harness::Harness<T,S>::poll_inner (8,945 samples, 78.48%)tokio::runtime::task::harness::Harness<T,S>::poll_innertokio::runtime::scheduler::multi_thread::worker::Context::run_task (9,009 samples, 79.04%)tokio::runtime::scheduler::multi_thread::worker::Context::run_tasktokio::runtime::scheduler::multi_thread::worker::Core::transition_from_searching (4 samples, 0.04%)tokio::runtime::scheduler::multi_thread::worker::<impl tokio::runtime::scheduler::multi_thread::handle::Handle>::transition_worker_from_searching (4 samples, 0.04%)parking_lot::condvar::Condvar::notify_one_slow (4 samples, 0.04%)parking_lot_core::parking_lot::unpark_requeue (4 samples, 0.04%)parking_lot_core::parking_lot::lock_bucket_pair (2 samples, 0.02%)parking_lot_core::parking_lot::hash (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Core::next_local_task (2 samples, 0.02%)tokio::runtime::scheduler::multi_thread::worker::Core::next_task (15 samples, 0.13%)tokio::runtime::scheduler::multi_thread::worker::Core::tune_global_queue_interval (7 samples, 0.06%)tokio::runtime::scheduler::multi_thread::stats::Stats::tuned_global_queue_interval (6 samples, 0.05%)<alloc::sync::Arc<T,A> as core::ops::deref::Deref>::deref (2 samples, 0.02%)alloc::sync::Arc<T,A>::inner (2 samples, 0.02%)core::ptr::non_null::NonNull<T>::as_ref (2 samples, 0.02%)core::num::<impl u32>::wrapping_sub (3 samples, 0.03%)tokio::loom::std::atomic_u32::AtomicU32::unsync_load (4 samples, 0.04%)core::sync::atomic::AtomicU32::load (4 samples, 0.04%)core::sync::atomic::atomic_load (4 samples, 0.04%)core::sync::atomic::AtomicU32::load (4 samples, 0.04%)core::sync::atomic::atomic_load (4 samples, 0.04%)tokio::runtime::scheduler::multi_thread::queue::Steal<T>::steal_into (37 samples, 0.32%)tokio::runtime::scheduler::multi_thread::queue::Steal<T>::steal_into2 (29 samples, 0.25%)core::sync::atomic::AtomicU64::load (19 samples, 0.17%)core::sync::atomic::atomic_load (19 samples, 0.17%)tokio::runtime::scheduler::multi_thread::worker::Core::transition_to_searching (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::idle::Idle::transition_worker_to_searching (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::idle::State::inc_num_searching (3 samples, 0.03%)core::sync::atomic::AtomicUsize::fetch_add (3 samples, 0.03%)core::sync::atomic::atomic_add (3 samples, 0.03%)tokio::runtime::scheduler::multi_thread::worker::Core::steal_work (52 samples, 0.46%)tokio::util::rand::FastRand::fastrand_n (3 samples, 0.03%)tokio::util::rand::FastRand::fastrand (3 samples, 0.03%)[libc.so.6] (10,624 samples, 93.21%)[libc.so.6][libc.so.6] (10,621 samples, 93.18%)[libc.so.6]std::sys::pal::unix::thread::Thread::new::thread_start (10,621 samples, 93.18%)std::sys::pal::unix::thread::Thread::new::thread_start<alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once (10,621 samples, 93.18%)<alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once<alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once (10,621 samples, 93.18%)<alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_oncecore::ops::function::FnOnce::call_once{{vtable.shim}} (10,621 samples, 93.18%)core::ops::function::FnOnce::call_once{{vtable.shim}}std::thread::Builder::spawn_unchecked_::_{{closure}} (10,621 samples, 93.18%)std::thread::Builder::spawn_unchecked_::_{{closure}}std::panic::catch_unwind (10,621 samples, 93.18%)std::panic::catch_unwindstd::panicking::try (10,621 samples, 93.18%)std::panicking::trystd::panicking::try::do_call (10,621 samples, 93.18%)std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (10,621 samples, 93.18%)<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_oncestd::thread::Builder::spawn_unchecked_::_{{closure}}::_{{closure}} (10,621 samples, 93.18%)std::thread::Builder::spawn_unchecked_::_{{closure}}::_{{closure}}std::sys::backtrace::__rust_begin_short_backtrace (10,621 samples, 93.18%)std::sys::backtrace::__rust_begin_short_backtracetokio::runtime::blocking::pool::Spawner::spawn_thread::_{{closure}} (10,621 samples, 93.18%)tokio::runtime::blocking::pool::Spawner::spawn_thread::_{{closure}}tokio::runtime::blocking::pool::Inner::run (10,621 samples, 93.18%)tokio::runtime::blocking::pool::Inner::runtokio::runtime::blocking::pool::Task::run (10,612 samples, 93.10%)tokio::runtime::blocking::pool::Task::runtokio::runtime::task::UnownedTask<S>::run (10,612 samples, 93.10%)tokio::runtime::task::UnownedTask<S>::runtokio::runtime::task::raw::RawTask::poll (10,612 samples, 93.10%)tokio::runtime::task::raw::RawTask::polltokio::runtime::task::raw::poll (10,612 samples, 93.10%)tokio::runtime::task::raw::polltokio::runtime::task::harness::Harness<T,S>::poll (10,612 samples, 93.10%)tokio::runtime::task::harness::Harness<T,S>::polltokio::runtime::task::harness::Harness<T,S>::poll_inner (10,612 samples, 93.10%)tokio::runtime::task::harness::Harness<T,S>::poll_innertokio::runtime::task::harness::poll_future (10,612 samples, 93.10%)tokio::runtime::task::harness::poll_futurestd::panic::catch_unwind (10,612 samples, 93.10%)std::panic::catch_unwindstd::panicking::try (10,612 samples, 93.10%)std::panicking::trystd::panicking::try::do_call (10,612 samples, 93.10%)std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once (10,612 samples, 93.10%)<core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_oncetokio::runtime::task::harness::poll_future::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::task::harness::poll_future::_{{closure}}tokio::runtime::task::core::Core<T,S>::poll (10,612 samples, 93.10%)tokio::runtime::task::core::Core<T,S>::polltokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut (10,612 samples, 93.10%)tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_muttokio::runtime::task::core::Core<T,S>::poll::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::task::core::Core<T,S>::poll::_{{closure}}<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll (10,612 samples, 93.10%)<tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::polltokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::scheduler::multi_thread::worker::Launch::launch::_{{closure}}tokio::runtime::scheduler::multi_thread::worker::run (10,612 samples, 93.10%)tokio::runtime::scheduler::multi_thread::worker::runtokio::runtime::context::runtime::enter_runtime (10,612 samples, 93.10%)tokio::runtime::context::runtime::enter_runtimetokio::runtime::scheduler::multi_thread::worker::run::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}tokio::runtime::context::set_scheduler (10,612 samples, 93.10%)tokio::runtime::context::set_schedulerstd::thread::local::LocalKey<T>::with (10,612 samples, 93.10%)std::thread::local::LocalKey<T>::withstd::thread::local::LocalKey<T>::try_with (10,612 samples, 93.10%)std::thread::local::LocalKey<T>::try_withtokio::runtime::context::set_scheduler::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::context::set_scheduler::_{{closure}}tokio::runtime::context::scoped::Scoped<T>::set (10,612 samples, 93.10%)tokio::runtime::context::scoped::Scoped<T>::settokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}} (10,612 samples, 93.10%)tokio::runtime::scheduler::multi_thread::worker::run::_{{closure}}::_{{closure}}tokio::runtime::scheduler::multi_thread::worker::Context::run (10,612 samples, 93.10%)tokio::runtime::scheduler::multi_thread::worker::Context::runtokio::runtime::scheduler::multi_thread::worker::Core::tick (2 samples, 0.02%)<futures_util::lock::mutex::MutexLockFuture<T> as core::future::future::Future>::poll (8 samples, 0.07%)<futures_util::future::poll_fn::PollFn<F> as core::future::future::Future>::poll (9 samples, 0.08%)wisp_mux::stream::MuxStreamRead::read::_{{closure}}::_{{closure}} (9 samples, 0.08%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (9 samples, 0.08%)<futures_util::stream::unfold::Unfold<T,F,Fut> as futures_core::stream::Stream>::poll_next (12 samples, 0.11%)wisp_mux::stream::MuxStreamRead::into_inner_stream::_{{closure}}::_{{closure}} (11 samples, 0.10%)wisp_mux::stream::MuxStreamRead::read::_{{closure}} (11 samples, 0.10%)<tokio::io::util::write_all::WriteAll<W> as core::future::future::Future>::poll (4 samples, 0.04%)<tokio::task::unconstrained::Unconstrained<F> as core::future::future::Future>::poll (2 samples, 0.02%)core::pin::Pin<Ptr>::set (3 samples, 0.03%)<core::pin::Pin<P> as core::future::future::Future>::poll (3 samples, 0.03%)<wisp_mux::sink_unfold::Unfold<T,F,R,CT,CF,CR> as futures_sink::Sink<Item>>::poll_flush (23 samples, 0.20%)wisp_mux::stream::MuxStreamWrite::into_inner_sink::_{{closure}}::_{{closure}} (17 samples, 0.15%)wisp_mux::stream::MuxStreamWrite::write_payload::_{{closure}} (17 samples, 0.15%)wisp_mux::stream::MuxStreamWrite::write_payload_internal::_{{closure}} (15 samples, 0.13%)wisp_mux::ws::LockedWebSocketWrite::write_split::_{{closure}} (13 samples, 0.11%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<(),wisp_mux::WispError>+core::marker::Send>>> (4 samples, 0.04%)core::ptr::drop_in_place<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<(),wisp_mux::WispError>+core::marker::Send>> (4 samples, 0.04%)<wisp_mux::ws::Payload as bytes::buf::buf_impl::Buf>::advance (3 samples, 0.03%)[libc.so.6] (28 samples, 0.25%)__send (4 samples, 0.04%)cfree (8 samples, 0.07%)clock_gettime (3 samples, 0.03%)core::ptr::drop_in_place<fastwebsockets::WriteHalf::write_frame<tokio_util::either::Either<tokio::net::tcp::split_owned::OwnedWriteHalf,tokio::net::unix::split_owned::OwnedWriteHalf>>::{{closure}}> (2 samples, 0.02%)core::ptr::drop_in_place<futures_util::lock::mutex::MutexGuard<alloc::boxed::Box<dyn wisp_mux::ws::WebSocketWrite+core::marker::Send>>> (7 samples, 0.06%)core::ptr::drop_in_place<wisp_mux::sink_unfold::UnfoldState<wisp_mux::stream::MuxStreamWrite,wisp_mux::stream::MuxStreamWrite::into_inner_sink::{{closure}}::{{closure}}>> (3 samples, 0.03%)core::ptr::drop_in_place<wisp_mux::stream::MuxStreamWrite::write_payload_internal::{{closure}}> (7 samples, 0.06%)core::ptr::drop_in_place<wisp_mux::ws::LockedWebSocketWrite::write_split::{{closure}}> (2 samples, 0.02%)core::ptr::drop_in_place<fastwebsockets::frame::Frame> (7 samples, 0.06%)core::ptr::drop_in_place<fastwebsockets::frame::Payload> (7 samples, 0.06%)fastwebsockets::WebSocketWrite<S>::write_frame::_{{closure}} (28 samples, 0.25%)fastwebsockets::WriteHalf::write_frame::_{{closure}} (12 samples, 0.11%)fastwebsockets::frame::Frame::writev::_{{closure}} (5 samples, 0.04%)<tokio::io::util::write_vectored::WriteVectored<W> as core::future::future::Future>::poll (5 samples, 0.04%)<&mut T as tokio::io::async_write::AsyncWrite>::poll_write_vectored (5 samples, 0.04%)tokio::io::async_write::AsyncWrite::poll_write_vectored (5 samples, 0.04%)<tokio_util::either::Either<L,R> as tokio::io::async_write::AsyncWrite>::poll_write (5 samples, 0.04%)<tokio::net::tcp::split_owned::OwnedWriteHalf as tokio::io::async_write::AsyncWrite>::poll_write (5 samples, 0.04%)futures_util::lock::mutex::Mutex<T>::remove_waker (5 samples, 0.04%)recv (5 samples, 0.04%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read (7 samples, 0.06%)mio::io_source::IoSource<T>::do_io (7 samples, 0.06%)mio::sys::unix::stateless_io_source::IoSourceState::do_io (7 samples, 0.06%)<&mio::net::tcp::stream::TcpStream as std::io::Read>::read::_{{closure}} (7 samples, 0.06%)<&std::net::tcp::TcpStream as std::io::Read>::read (7 samples, 0.06%)std::sys_common::net::TcpStream::read (7 samples, 0.06%)std::sys::pal::unix::net::Socket::read (7 samples, 0.06%)std::sys::pal::unix::net::Socket::recv_with_flags (7 samples, 0.06%)tokio::net::tcp::stream::TcpStream::poll_read_priv (14 samples, 0.12%)tokio::io::poll_evented::PollEvented<E>::poll_read (9 samples, 0.08%)tokio::runtime::io::registration::Registration::poll_read_ready (2 samples, 0.02%)tokio::net::tcp::stream::TcpStream::poll_write_priv (22 samples, 0.19%)tokio::io::poll_evented::PollEvented<E>::poll_write (2 samples, 0.02%)tokio::runtime::io::registration::Registration::poll_write_ready (2 samples, 0.02%)tokio::process::imp::GlobalOrphanQueue::reap_orphans (2 samples, 0.02%)tokio::process::imp::orphan::OrphanQueueImpl<T>::reap_orphans (2 samples, 0.02%)tokio::loom::std::parking_lot::Mutex<T>::try_lock (2 samples, 0.02%)lock_api::mutex::Mutex<R,T>::try_lock (2 samples, 0.02%)<parking_lot::raw_mutex::RawMutex as lock_api::mutex::RawMutex>::try_lock (2 samples, 0.02%)core::sync::atomic::AtomicU8::load (2 samples, 0.02%)core::sync::atomic::atomic_load (2 samples, 0.02%)tokio::runtime::io::registration::Registration::poll_ready (15 samples, 0.13%)tokio::runtime::io::scheduled_io::ScheduledIo::wake (2 samples, 0.02%)tokio::runtime::task::state::State::transition_to_idle (2 samples, 0.02%)core::iter::traits::iterator::Iterator::min (7 samples, 0.06%)core::iter::traits::iterator::Iterator::min_by (7 samples, 0.06%)core::iter::traits::iterator::Iterator::reduce (7 samples, 0.06%)<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (7 samples, 0.06%)<core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::find_map (7 samples, 0.06%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (7 samples, 0.06%)tokio::runtime::time::Driver::park_internal::_{{closure}} (7 samples, 0.06%)tokio::runtime::time::wheel::Wheel::next_expiration_time (7 samples, 0.06%)tokio::runtime::time::Driver::park_internal (22 samples, 0.19%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process (10 samples, 0.09%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_time (10 samples, 0.09%)core::iter::traits::iterator::Iterator::min (10 samples, 0.09%)core::iter::traits::iterator::Iterator::min_by (10 samples, 0.09%)core::iter::traits::iterator::Iterator::reduce (10 samples, 0.09%)<core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (10 samples, 0.09%)core::iter::traits::iterator::Iterator::find_map (10 samples, 0.09%)core::iter::traits::iterator::Iterator::try_fold (10 samples, 0.09%)core::iter::traits::iterator::Iterator::find_map::check::_{{closure}} (10 samples, 0.09%)core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (10 samples, 0.09%)tokio::runtime::time::_<impl tokio::runtime::time::handle::Handle>::process_at_time::_{{closure}} (8 samples, 0.07%)tokio::runtime::time::<impl tokio::runtime::time::handle::Handle>::process_at_sharded_time (8 samples, 0.07%)tokio::runtime::time::wheel::Wheel::poll_at (8 samples, 0.07%)tokio::runtime::time::wheel::Wheel::next_expiration (25 samples, 0.22%)tokio::util::linked_list::LinkedList<L,<L as tokio::util::linked_list::Link>::Target>::is_empty (12 samples, 0.11%)core::option::Option<T>::is_some (12 samples, 0.11%)wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketRead for fastwebsockets::fragment::FragmentCollectorRead<S>>::wisp_read_frame::_{{closure}} (2 samples, 0.02%)wisp_mux::fastwebsockets::_<impl wisp_mux::ws::WebSocketWrite for fastwebsockets::WebSocketWrite<S>>::wisp_write_split::_{{closure}} (4 samples, 0.04%)[unknown] (397 samples, 3.48%)[un..wisp_mux::packet::<impl core::convert::From<wisp_mux::packet::Packet> for bytes::bytes_mut::BytesMut>::from (2 samples, 0.02%)__send (7 samples, 0.06%)bytes::bytes_mut::BytesMut::reserve_inner (4 samples, 0.04%)bytes::bytes_mut::BytesMut::split_to (2 samples, 0.02%)malloc (3 samples, 0.03%)mio::sys::unix::waker::eventfd::WakerInternal::wake (4 samples, 0.04%)<&std::fs::File as std::io::Write>::write (2 samples, 0.02%)std::sys::pal::unix::fs::File::write (2 samples, 0.02%)std::sys::pal::unix::fd::FileDesc::write (2 samples, 0.02%)recv (3 samples, 0.03%)std::time::Instant::now (3 samples, 0.03%)std::sys::pal::unix::time::Instant::now (3 samples, 0.03%)syscall (2 samples, 0.02%)tokio::net::tcp::stream::TcpStream::poll_read_priv (9 samples, 0.08%)tokio::net::tcp::stream::TcpStream::poll_write_priv (6 samples, 0.05%)tokio::runtime::io::registration::Registration::poll_ready (2 samples, 0.02%)core::ptr::drop_in_place<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>>> (2 samples, 0.02%)core::ptr::drop_in_place<alloc::boxed::Box<dyn core::future::future::Future+Output = core::result::Result<wisp_mux::ws::Frame,wisp_mux::WispError>+core::marker::Send>> (2 samples, 0.02%)wisp_mux::MuxInner::as_future::_{{closure}}::_{{closure}}::_{{closure}} (7 samples, 0.06%)futures_util::future::future::FutureExt::poll_unpin (5 samples, 0.04%)<core::pin::Pin<P> as core::future::future::Future>::poll (5 samples, 0.04%)<futures_util::future::future::fuse::Fuse<Fut> as core::future::future::Future>::poll (5 samples, 0.04%)wisp_mux::MuxInner::server_loop::_{{closure}} (5 samples, 0.04%)all (11,398 samples, 100%)tokio-runtime-w (11,382 samples, 99.86%)tokio-runtime-w \ No newline at end of file diff --git a/server/src/config.rs b/server/src/config.rs new file mode 100644 index 0000000..2d4dd05 --- /dev/null +++ b/server/src/config.rs @@ -0,0 +1,207 @@ +use std::{collections::HashMap, ops::RangeInclusive}; + +use lazy_static::lazy_static; +use regex::RegexSet; +use serde::{Deserialize, Serialize}; +use wisp_mux::extensions::{ + password::PasswordProtocolExtensionBuilder, udp::UdpProtocolExtensionBuilder, + ProtocolExtensionBuilder, +}; + +use crate::CONFIG; + +type AnyProtocolExtensionBuilder = Box; + +struct ConfigCache { + pub blocked_ports: Vec>, + pub allowed_ports: Vec>, + + pub allowed_hosts: RegexSet, + pub blocked_hosts: RegexSet, + + pub wisp_config: (Option>, u32), +} + +lazy_static! { + static ref CONFIG_CACHE: ConfigCache = { + ConfigCache { + allowed_ports: CONFIG + .stream + .allow_ports + .iter() + .map(|x| x[0]..=x[1]) + .collect(), + blocked_ports: CONFIG + .stream + .block_ports + .iter() + .map(|x| x[0]..=x[1]) + .collect(), + allowed_hosts: RegexSet::new(&CONFIG.stream.allow_hosts).unwrap(), + blocked_hosts: RegexSet::new(&CONFIG.stream.block_hosts).unwrap(), + wisp_config: CONFIG.wisp.to_opts_inner().unwrap(), + } + }; +} + +pub fn validate_config_cache() { + let _ = CONFIG_CACHE.wisp_config; +} + +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "lowercase")] +pub enum SocketType { + #[default] + Tcp, + Unix, +} + +#[derive(Serialize, Deserialize)] +#[serde(default)] +pub struct ServerConfig { + pub bind: String, + pub socket: SocketType, + pub resolve_ipv6: bool, + + pub max_message_size: usize, + // TODO + // prefix: String, +} + +impl Default for ServerConfig { + fn default() -> Self { + Self { + bind: "127.0.0.1:4000".to_owned(), + socket: SocketType::default(), + resolve_ipv6: false, + + max_message_size: 64 * 1024, + } + } +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "lowercase")] +pub enum ProtocolExtension { + Udp, + Password, +} + +#[derive(Serialize, Deserialize)] +#[serde(default)] +pub struct WispConfig { + pub wisp_v2: bool, + pub buffer_size: u32, + + pub extensions: Vec, + pub password_extension_users: HashMap, + // TODO + // enable_wsproxy: bool, +} + +impl Default for WispConfig { + fn default() -> Self { + Self { + buffer_size: 512, + wisp_v2: false, + + extensions: Vec::new(), + password_extension_users: HashMap::new(), + } + } +} + +impl WispConfig { + pub fn to_opts_inner(&self) -> anyhow::Result<(Option>, u32)> { + if self.wisp_v2 { + let mut extensions: Vec> = Vec::new(); + + if self.extensions.contains(&ProtocolExtension::Udp) { + extensions.push(Box::new(UdpProtocolExtensionBuilder)); + } + + if self.extensions.contains(&ProtocolExtension::Password) { + extensions.push(Box::new(PasswordProtocolExtensionBuilder::new_server( + self.password_extension_users.clone(), + ))); + } + + Ok((Some(extensions), self.buffer_size)) + } else { + Ok((None, self.buffer_size)) + } + } + + pub fn to_opts(&self) -> (Option<&'static [AnyProtocolExtensionBuilder]>, u32) { + ( + CONFIG_CACHE.wisp_config.0.as_deref(), + CONFIG_CACHE.wisp_config.1, + ) + } +} + +#[derive(Serialize, Deserialize)] +#[serde(default)] +pub struct StreamConfig { + pub allow_udp: bool, + + pub allow_direct_ip: bool, + pub allow_loopback: bool, + pub allow_multicast: bool, + + pub allow_global: bool, + pub allow_non_global: bool, + + pub allow_hosts: Vec, + pub block_hosts: Vec, + + pub allow_ports: Vec>, + pub block_ports: Vec>, +} + +impl Default for StreamConfig { + fn default() -> Self { + Self { + allow_udp: true, + + allow_direct_ip: true, + allow_loopback: true, + allow_multicast: true, + + allow_global: true, + allow_non_global: true, + + allow_hosts: Vec::new(), + block_hosts: Vec::new(), + + allow_ports: Vec::new(), + block_ports: Vec::new(), + } + } +} + +impl StreamConfig { + pub fn allowed_ports(&self) -> &'static [RangeInclusive] { + &CONFIG_CACHE.allowed_ports + } + + pub fn blocked_ports(&self) -> &'static [RangeInclusive] { + &CONFIG_CACHE.blocked_ports + } + + pub fn allowed_hosts(&self) -> &RegexSet { + &CONFIG_CACHE.allowed_hosts + } + + pub fn blocked_hosts(&self) -> &RegexSet { + &CONFIG_CACHE.blocked_hosts + } +} + +#[derive(Serialize, Deserialize, Default)] +#[serde(default)] +pub struct Config { + pub server: ServerConfig, + pub wisp: WispConfig, + pub stream: StreamConfig, +} diff --git a/server/src/main.rs b/server/src/main.rs new file mode 100644 index 0000000..061c41a --- /dev/null +++ b/server/src/main.rs @@ -0,0 +1,197 @@ +#![feature(ip)] + +use std::{env::args, fs::read_to_string, ops::Deref}; + +use anyhow::Context; +use bytes::Bytes; +use config::{validate_config_cache, Config}; +use fastwebsockets::{upgrade::UpgradeFut, FragmentCollectorRead}; +use http_body_util::Empty; +use hyper::{body::Incoming, server::conn::http1::Builder, service::service_fn, Request, Response}; +use hyper_util::rt::TokioIo; +use lazy_static::lazy_static; +use stream::{ + copy_read_fast, ClientStream, ResolvedPacket, ServerListener, ServerStream, ServerStreamExt, +}; +use tokio::{io::copy, select}; +use tokio_util::compat::FuturesAsyncWriteCompatExt; +use wisp_mux::{CloseReason, ConnectPacket, MuxStream, ServerMux}; + +mod config; +mod stream; + +lazy_static! { + pub static ref CONFIG: Config = { + if let Some(path) = args().nth(1) { + toml::from_str(&read_to_string(path).unwrap()).unwrap() + } else { + Config::default() + } + }; +} + +async fn handle_stream(connect: ConnectPacket, muxstream: MuxStream) { + let Ok(resolved) = ClientStream::resolve(connect).await else { + let _ = muxstream.close(CloseReason::ServerStreamUnreachable).await; + return; + }; + let connect = match resolved { + ResolvedPacket::Valid(x) => x, + ResolvedPacket::NoResolvedAddrs => { + let _ = muxstream.close(CloseReason::ServerStreamUnreachable).await; + return; + } + ResolvedPacket::Blocked => { + let _ = muxstream + .close(CloseReason::ServerStreamBlockedAddress) + .await; + return; + } + }; + + let Ok(stream) = ClientStream::connect(connect).await else { + let _ = muxstream.close(CloseReason::ServerStreamUnreachable).await; + return; + }; + + match stream { + ClientStream::Tcp(stream) => { + let closer = muxstream.get_close_handle(); + + let ret: anyhow::Result<()> = async move { + let (muxread, muxwrite) = muxstream.into_io().into_asyncrw().into_split(); + let (mut tcpread, tcpwrite) = stream.into_split(); + let mut muxwrite = muxwrite.compat_write(); + select! { + x = copy_read_fast(muxread, tcpwrite) => x?, + x = copy(&mut tcpread, &mut muxwrite) => {x?;}, + } + // TODO why is copy_write_fast not working? + /* + let (muxread, muxwrite) = muxstream.into_split(); + let muxread = muxread.into_stream().into_asyncread(); + let (mut tcpread, tcpwrite) = stream.into_split(); + select! { + x = copy_read_fast(muxread, tcpwrite) => x?, + x = copy_write_fast(muxwrite, tcpread) => {x?;}, + } + */ + Ok(()) + } + .await; + + match ret { + Ok(()) => { + let _ = closer.close(CloseReason::Voluntary).await; + } + Err(_) => { + let _ = closer.close(CloseReason::Unexpected).await; + } + } + } + ClientStream::Udp(stream) => { + let closer = muxstream.get_close_handle(); + + let ret: anyhow::Result<()> = async move { + let mut data = vec![0u8; 65507]; + loop { + select! { + size = stream.recv(&mut data) => { + let size = size?; + muxstream.write(&data[..size]).await?; + } + data = muxstream.read() => { + if let Some(data) = data { + stream.send(&data).await?; + } else { + break Ok(()); + } + } + } + } + } + .await; + + match ret { + Ok(()) => { + let _ = closer.close(CloseReason::Voluntary).await; + } + Err(_) => { + let _ = closer.close(CloseReason::Unexpected).await; + } + } + } + ClientStream::Invalid => { + let _ = muxstream.close(CloseReason::ServerStreamInvalidInfo).await; + } + ClientStream::Blocked => { + let _ = muxstream + .close(CloseReason::ServerStreamBlockedAddress) + .await; + } + }; +} + +async fn handle(fut: UpgradeFut) -> anyhow::Result<()> { + let mut ws = fut.await.context("failed to await upgrade future")?; + + ws.set_max_message_size(CONFIG.server.max_message_size); + + let (read, write) = ws.split(|x| { + let parts = x.into_inner().downcast::>().unwrap(); + assert_eq!(parts.read_buf.len(), 0); + parts.io.into_inner().split() + }); + let read = FragmentCollectorRead::new(read); + + let (extensions, buffer_size) = CONFIG.wisp.to_opts_inner()?; + + let (mux, fut) = ServerMux::create(read, write, buffer_size, extensions.as_deref()) + .await + .context("failed to create server multiplexor")? + .with_no_required_extensions(); + + tokio::spawn(tokio::task::unconstrained(fut)); + + while let Some((connect, stream)) = mux.server_new_stream().await { + tokio::spawn(tokio::task::unconstrained(handle_stream(connect, stream))); + } + + Ok(()) +} + +type Body = Empty; +async fn upgrade(mut req: Request) -> anyhow::Result> { + let (resp, fut) = fastwebsockets::upgrade::upgrade(&mut req)?; + + tokio::spawn(async move { + if let Err(e) = handle(fut).await { + println!("{:?}", e); + }; + }); + + Ok(resp) +} + +#[tokio::main(flavor = "multi_thread")] +async fn main() -> anyhow::Result<()> { + validate_config_cache(); + + println!("{}", toml::to_string_pretty(CONFIG.deref()).unwrap()); + + let listener = ServerListener::new().await?; + loop { + let (stream, _) = listener.accept().await?; + tokio::spawn(async move { + let stream = TokioIo::new(stream); + + let fut = Builder::new() + .serve_connection(stream, service_fn(upgrade)) + .with_upgrades(); + + if let Err(e) = fut.await { + println!("{:?}", e); + } + }); + } +} diff --git a/server/src/stream.rs b/server/src/stream.rs new file mode 100644 index 0000000..8837fe9 --- /dev/null +++ b/server/src/stream.rs @@ -0,0 +1,240 @@ +use std::{ + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, + str::FromStr, +}; + +use anyhow::Context; +use bytes::BytesMut; +use futures_util::AsyncBufReadExt; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::{ + lookup_host, + tcp::{self, OwnedReadHalf, OwnedWriteHalf}, + unix, TcpListener, TcpStream, UdpSocket, UnixListener, UnixStream, + }, +}; +use tokio_util::either::Either; +use wisp_mux::{ConnectPacket, MuxStreamAsyncRead, MuxStreamWrite, StreamType}; + +use crate::{config::SocketType, CONFIG}; + +pub enum ServerListener { + Tcp(TcpListener), + Unix(UnixListener), +} + +pub type ServerStream = Either; +pub type ServerStreamRead = Either; +pub type ServerStreamWrite = Either; + +pub trait ServerStreamExt { + fn split(self) -> (ServerStreamRead, ServerStreamWrite); +} + +impl ServerStreamExt for ServerStream { + fn split(self) -> (ServerStreamRead, ServerStreamWrite) { + match self { + Self::Left(x) => { + let (r, w) = x.into_split(); + (Either::Left(r), Either::Left(w)) + } + Self::Right(x) => { + let (r, w) = x.into_split(); + (Either::Right(r), Either::Right(w)) + } + } + } +} + +impl ServerListener { + pub async fn new() -> anyhow::Result { + Ok(match CONFIG.server.socket { + SocketType::Tcp => Self::Tcp( + TcpListener::bind(&CONFIG.server.bind) + .await + .with_context(|| { + format!("failed to bind to tcp address `{}`", CONFIG.server.bind) + })?, + ), + SocketType::Unix => { + Self::Unix(UnixListener::bind(&CONFIG.server.bind).with_context(|| { + format!("failed to bind to unix socket at `{}`", CONFIG.server.bind) + })?) + } + }) + } + + pub async fn accept(&self) -> anyhow::Result<(ServerStream, Option)> { + match self { + Self::Tcp(x) => x + .accept() + .await + .map(|(x, y)| (Either::Left(x), Some(y.to_string()))) + .context("failed to accept tcp connection"), + Self::Unix(x) => x + .accept() + .await + .map(|(x, y)| { + ( + Either::Right(x), + y.as_pathname() + .and_then(|x| x.to_str()) + .map(ToString::to_string), + ) + }) + .context("failed to accept unix socket connection"), + } + } +} + +pub enum ClientStream { + Tcp(TcpStream), + Udp(UdpSocket), + Blocked, + Invalid, +} + +pub enum ResolvedPacket { + Valid(ConnectPacket), + NoResolvedAddrs, + Blocked, +} + +impl ClientStream { + pub async fn resolve(packet: ConnectPacket) -> anyhow::Result { + if !CONFIG.stream.allow_udp && packet.stream_type == StreamType::Udp { + return Ok(ResolvedPacket::Blocked); + } + + if CONFIG + .stream + .blocked_ports() + .iter() + .any(|x| x.contains(&packet.destination_port)) + && !CONFIG + .stream + .allowed_ports() + .iter() + .any(|x| x.contains(&packet.destination_port)) + { + return Ok(ResolvedPacket::Blocked); + } + + if let Ok(addr) = IpAddr::from_str(&packet.destination_hostname) { + if !CONFIG.stream.allow_direct_ip { + return Ok(ResolvedPacket::Blocked); + } + + if addr.is_loopback() && !CONFIG.stream.allow_loopback { + return Ok(ResolvedPacket::Blocked); + } + + if addr.is_multicast() && !CONFIG.stream.allow_multicast { + return Ok(ResolvedPacket::Blocked); + } + + if (addr.is_global() && !CONFIG.stream.allow_global) + || (!addr.is_global() && !CONFIG.stream.allow_non_global) + { + return Ok(ResolvedPacket::Blocked); + } + } + + if CONFIG + .stream + .blocked_hosts() + .is_match(&packet.destination_hostname) + && !CONFIG + .stream + .allowed_hosts() + .is_match(&packet.destination_hostname) + { + return Ok(ResolvedPacket::Blocked); + } + + let packet = lookup_host(packet.destination_hostname + ":0") + .await + .context("failed to resolve hostname")? + .filter(|x| CONFIG.server.resolve_ipv6 || x.is_ipv4()) + .map(|x| ConnectPacket { + stream_type: packet.stream_type, + destination_hostname: x.ip().to_string(), + destination_port: packet.destination_port, + }) + .next(); + + Ok(packet + .map(ResolvedPacket::Valid) + .unwrap_or(ResolvedPacket::NoResolvedAddrs)) + } + + pub async fn connect(packet: ConnectPacket) -> anyhow::Result { + let ipaddr = IpAddr::from_str(&packet.destination_hostname) + .context("failed to parse hostname as ipaddr")?; + + match packet.stream_type { + StreamType::Tcp => { + let stream = TcpStream::connect(SocketAddr::new(ipaddr, packet.destination_port)) + .await + .with_context(|| { + format!("failed to connect to host {}", packet.destination_hostname) + })?; + + Ok(ClientStream::Tcp(stream)) + } + StreamType::Udp => { + if !CONFIG.stream.allow_udp { + return Ok(ClientStream::Blocked); + } + + let bind_addr = if ipaddr.is_ipv4() { + SocketAddr::new(Ipv4Addr::new(0, 0, 0, 0).into(), 0) + } else { + SocketAddr::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0).into(), 0) + }; + + let stream = UdpSocket::bind(bind_addr).await?; + + stream + .connect(SocketAddr::new(ipaddr, packet.destination_port)) + .await?; + + Ok(ClientStream::Udp(stream)) + } + StreamType::Unknown(_) => Ok(ClientStream::Invalid), + } + } +} + +pub async fn copy_read_fast( + mut muxrx: MuxStreamAsyncRead, + mut tcptx: OwnedWriteHalf, +) -> std::io::Result<()> { + loop { + let buf = muxrx.fill_buf().await?; + if buf.is_empty() { + tcptx.flush().await?; + return Ok(()); + } + + let i = tcptx.write(buf).await?; + if i == 0 { + return Err(std::io::ErrorKind::WriteZero.into()); + } + + muxrx.consume_unpin(i); + } +} + +#[allow(dead_code)] +pub async fn copy_write_fast( + muxtx: MuxStreamWrite, + mut tcprx: OwnedReadHalf, +) -> anyhow::Result<()> { + loop { + let mut buf = BytesMut::with_capacity(8 * 1024); + let amt = tcprx.read(&mut buf).await?; + muxtx.write(&buf[..amt]).await?; + } +} diff --git a/wisp/src/fastwebsockets.rs b/wisp/src/fastwebsockets.rs index 8604055..a7b3e3d 100644 --- a/wisp/src/fastwebsockets.rs +++ b/wisp/src/fastwebsockets.rs @@ -9,7 +9,7 @@ use tokio::io::{AsyncRead, AsyncWrite}; use crate::{ws::LockedWebSocketWrite, WispError}; -fn match_payload<'a>(payload: Payload<'a>) -> crate::ws::Payload<'a> { +fn match_payload(payload: Payload<'_>) -> crate::ws::Payload<'_> { match payload { Payload::Bytes(x) => crate::ws::Payload::Bytes(x), Payload::Owned(x) => crate::ws::Payload::Bytes(BytesMut::from(x.deref())), @@ -18,7 +18,7 @@ fn match_payload<'a>(payload: Payload<'a>) -> crate::ws::Payload<'a> { } } -fn match_payload_reverse<'a>(payload: crate::ws::Payload<'a>) -> Payload<'a> { +fn match_payload_reverse(payload: crate::ws::Payload<'_>) -> Payload<'_> { match payload { crate::ws::Payload::Bytes(x) => Payload::Bytes(x), crate::ws::Payload::Borrowed(x) => Payload::Borrowed(x), @@ -94,6 +94,18 @@ impl crate::ws::WebSocketWrite for WebSocketWrite< self.write_frame(frame.into()).await.map_err(|e| e.into()) } + async fn wisp_write_split(&mut self, header: crate::ws::Frame<'_>, body: crate::ws::Frame<'_>) -> Result<(), WispError> { + let mut header = Frame::from(header); + header.fin = false; + self.write_frame(header).await?; + + let mut body = Frame::from(body); + body.opcode = OpCode::Continuation; + self.write_frame(body).await?; + + Ok(()) + } + async fn wisp_close(&mut self) -> Result<(), WispError> { self.write_frame(Frame::close(CloseCode::Normal.into(), b"")) .await diff --git a/wisp/src/stream.rs b/wisp/src/stream.rs index c1337b7..100926f 100644 --- a/wisp/src/stream.rs +++ b/wisp/src/stream.rs @@ -12,7 +12,7 @@ use futures::{ ready, select, stream::{self, IntoAsyncRead}, task::{noop_waker_ref, Context, Poll}, - AsyncBufRead, AsyncRead, AsyncWrite, Future, FutureExt, Sink, Stream, TryStreamExt, + AsyncBufRead, AsyncRead, AsyncWrite, FutureExt, Sink, Stream, TryStreamExt, }; use pin_project_lite::pin_project; use std::{ @@ -79,11 +79,18 @@ impl MuxStreamRead { Some(bytes) } - pub(crate) fn into_stream(self) -> Pin + Send>> { + pub(crate) fn into_inner_stream(self) -> Pin + Send>> { Box::pin(stream::unfold(self, |rx| async move { Some((rx.read().await?, rx)) })) } + + /// Turn the read half into one that implements futures `Stream`, consuming it. + pub fn into_stream(self) -> MuxStreamIoStream { + MuxStreamIoStream { + rx: self.into_inner_stream(), + } + } } /// Write side of a multiplexor stream. @@ -101,9 +108,10 @@ pub struct MuxStreamWrite { } impl MuxStreamWrite { - pub(crate) async fn write_payload_internal( + pub(crate) async fn write_payload_internal<'a>( &self, - frame: Frame<'static>, + header: Frame<'static>, + body: Frame<'a>, ) -> Result<(), WispError> { if self.role == Role::Client && self.stream_type == StreamType::Tcp @@ -115,7 +123,7 @@ impl MuxStreamWrite { return Err(WispError::StreamAlreadyClosed); } - self.tx.write_frame(frame).await?; + self.tx.write_split(header, body).await?; if self.role == Role::Client && self.stream_type == StreamType::Tcp { self.flow_control.store( @@ -127,12 +135,13 @@ impl MuxStreamWrite { } /// Write a payload to the stream. - pub fn write_payload<'a>( - &'a self, - data: Payload<'_>, - ) -> impl Future> + 'a { - let frame: Frame<'static> = Frame::from(Packet::new_data(self.stream_id, data)); - self.write_payload_internal(frame) + pub async fn write_payload(&self, data: Payload<'_>) -> Result<(), WispError> { + let frame: Frame<'static> = Frame::from(Packet::new_data( + self.stream_id, + Payload::Bytes(BytesMut::new()), + )); + self.write_payload_internal(frame, Frame::binary(data)) + .await } /// Write data to the stream. @@ -188,12 +197,14 @@ impl MuxStreamWrite { Ok(()) } - pub(crate) fn into_sink(self) -> Pin, Error = WispError> + Send>> { + pub(crate) fn into_inner_sink( + self, + ) -> Pin, Error = WispError> + Send>> { let handle = self.get_close_handle(); Box::pin(sink_unfold::unfold( self, |tx, data| async move { - tx.write_payload_internal(data).await?; + tx.write_payload(data).await?; Ok(tx) }, handle, @@ -203,6 +214,13 @@ impl MuxStreamWrite { }, )) } + + /// Turn the write half into one that implements futures `Sink`, consuming it. + pub fn into_sink(self) -> MuxStreamIoSink { + MuxStreamIoSink { + tx: self.into_inner_sink(), + } + } } impl Drop for MuxStreamWrite { @@ -316,13 +334,8 @@ impl MuxStream { /// Turn the stream into one that implements futures `Stream + Sink`, consuming it. pub fn into_io(self) -> MuxStreamIo { MuxStreamIo { - rx: MuxStreamIoStream { - rx: self.rx.into_stream(), - }, - tx: MuxStreamIoSink { - tx: self.tx.into_sink(), - stream_id: self.stream_id, - }, + rx: self.rx.into_stream(), + tx: self.tx.into_sink(), } } } @@ -456,8 +469,7 @@ pin_project! { /// Write side of a multiplexor stream that implements futures `Sink`. pub struct MuxStreamIoSink { #[pin] - tx: Pin, Error = WispError> + Send>>, - stream_id: u32, + tx: Pin, Error = WispError> + Send>>, } } @@ -477,13 +489,9 @@ impl Sink<&[u8]> for MuxStreamIoSink { .map_err(std::io::Error::other) } fn start_send(self: Pin<&mut Self>, item: &[u8]) -> Result<(), Self::Error> { - let stream_id = self.stream_id; self.project() .tx - .start_send(Frame::from(Packet::new_data( - stream_id, - Payload::Borrowed(item), - ))) + .start_send(Payload::Bytes(BytesMut::from(item))) .map_err(std::io::Error::other) } fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { diff --git a/wisp/src/ws.rs b/wisp/src/ws.rs index 27ae03f..a070395 100644 --- a/wisp/src/ws.rs +++ b/wisp/src/ws.rs @@ -166,6 +166,18 @@ pub trait WebSocketWrite { /// Close the socket. async fn wisp_close(&mut self) -> Result<(), WispError>; + + /// Write a split frame to the socket. + async fn wisp_write_split( + &mut self, + header: Frame<'_>, + body: Frame<'_>, + ) -> Result<(), WispError> { + let mut payload = BytesMut::from(header.payload); + payload.extend_from_slice(&body.payload); + self.wisp_write_frame(Frame::binary(Payload::Bytes(payload))) + .await + } } /// Locked WebSocket. @@ -183,6 +195,14 @@ impl LockedWebSocketWrite { self.0.lock().await.wisp_write_frame(frame).await } + pub(crate) async fn write_split( + &self, + header: Frame<'_>, + body: Frame<'_>, + ) -> Result<(), WispError> { + self.0.lock().await.wisp_write_split(header, body).await + } + /// Close the websocket. pub async fn close(&self) -> Result<(), WispError> { self.0.lock().await.wisp_close().await