summaryrefslogtreecommitdiffstats
path: root/vendor/tracing-subscriber/benches/support/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/tracing-subscriber/benches/support/mod.rs')
-rw-r--r--vendor/tracing-subscriber/benches/support/mod.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/vendor/tracing-subscriber/benches/support/mod.rs b/vendor/tracing-subscriber/benches/support/mod.rs
new file mode 100644
index 000000000..25e9e7e22
--- /dev/null
+++ b/vendor/tracing-subscriber/benches/support/mod.rs
@@ -0,0 +1,49 @@
+use std::{
+ sync::{Arc, Barrier},
+ thread,
+ time::{Duration, Instant},
+};
+use tracing::dispatcher::Dispatch;
+
+#[derive(Clone)]
+pub(super) struct MultithreadedBench {
+ start: Arc<Barrier>,
+ end: Arc<Barrier>,
+ dispatch: Dispatch,
+}
+
+impl MultithreadedBench {
+ pub(super) fn new(dispatch: Dispatch) -> Self {
+ Self {
+ start: Arc::new(Barrier::new(5)),
+ end: Arc::new(Barrier::new(5)),
+ dispatch,
+ }
+ }
+
+ pub(super) fn thread(&self, f: impl FnOnce() + Send + 'static) -> &Self {
+ self.thread_with_setup(|start| {
+ start.wait();
+ f()
+ })
+ }
+
+ pub(super) fn thread_with_setup(&self, f: impl FnOnce(&Barrier) + Send + 'static) -> &Self {
+ let this = self.clone();
+ thread::spawn(move || {
+ let dispatch = this.dispatch.clone();
+ tracing::dispatcher::with_default(&dispatch, move || {
+ f(&*this.start);
+ this.end.wait();
+ })
+ });
+ self
+ }
+
+ pub(super) fn run(&self) -> Duration {
+ self.start.wait();
+ let t0 = Instant::now();
+ self.end.wait();
+ t0.elapsed()
+ }
+}