|
1 |
| -#[cfg(feature = "custom-report")] |
2 |
| -use charts_rs::LineChart; |
3 | 1 | use hyper::server::conn::http1;
|
4 | 2 | use hyper_util::rt::TokioIo;
|
5 |
| -use socketioxide::{ |
6 |
| - extract::{AckSender, SocketRef}, |
7 |
| - SocketIo, |
8 |
| -}; |
| 3 | +use socketioxide::{extract::SocketRef, SocketIo}; |
9 | 4 | use std::net::SocketAddr;
|
10 |
| -#[cfg(feature = "custom-report")] |
11 |
| -use std::sync::{atomic::AtomicUsize, Mutex}; |
12 |
| -#[cfg(feature = "custom-report")] |
13 |
| -use std::time::Instant; |
14 | 5 | use tokio::net::TcpListener;
|
15 |
| -#[cfg(feature = "custom-report")] |
16 |
| -use tracing::Level; |
17 |
| -#[cfg(feature = "custom-report")] |
18 |
| -use tracing_subscriber::FmtSubscriber; |
19 |
| - |
20 |
| -use std::alloc::{GlobalAlloc, Layout, System}; |
21 |
| - |
22 |
| -struct MyAllocator; |
23 |
| - |
24 |
| -#[cfg(feature = "custom-report")] |
25 |
| -static CURRENT: AtomicUsize = AtomicUsize::new(0); |
26 |
| -#[cfg(feature = "custom-report")] |
27 |
| -static MEMORY: Mutex<Vec<(Instant, usize, usize)>> = Mutex::new(Vec::new()); |
28 |
| -#[cfg(feature = "custom-report")] |
29 |
| -static SOCKETS_CNT: AtomicUsize = AtomicUsize::new(0); |
30 |
| - |
31 |
| -unsafe impl GlobalAlloc for MyAllocator { |
32 |
| - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { |
33 |
| - #[cfg(feature = "custom-report")] |
34 |
| - CURRENT.fetch_add(layout.size(), std::sync::atomic::Ordering::Relaxed); |
35 |
| - System.alloc(layout) |
36 |
| - } |
37 |
| - |
38 |
| - unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { |
39 |
| - #[cfg(feature = "custom-report")] |
40 |
| - CURRENT.fetch_sub(layout.size(), std::sync::atomic::Ordering::Relaxed); |
41 |
| - System.dealloc(ptr, layout) |
42 |
| - } |
43 |
| -} |
44 |
| - |
45 |
| -#[global_allocator] |
46 |
| -static GLOBAL: MyAllocator = MyAllocator; |
47 | 6 |
|
48 | 7 | fn on_connect(socket: SocketRef) {
|
49 |
| - #[cfg(feature = "custom-report")] |
50 |
| - SOCKETS_CNT.fetch_add(1, std::sync::atomic::Ordering::Relaxed); |
51 |
| - socket.on("ping", |ack: AckSender| { |
52 |
| - ack.send("pong").ok(); |
53 |
| - }); |
54 |
| - socket.on_disconnect(|| { |
55 |
| - #[cfg(feature = "custom-report")] |
56 |
| - SOCKETS_CNT.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); |
| 8 | + socket.on("ping", |s: SocketRef| { |
| 9 | + s.emit("pong", ()).ok(); |
57 | 10 | });
|
58 | 11 | }
|
59 | 12 |
|
60 | 13 | #[tokio::main]
|
61 | 14 | async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
62 | 15 | let (svc, io) = SocketIo::new_svc();
|
63 |
| - #[cfg(feature = "custom-report")] |
64 |
| - { |
65 |
| - let subscriber = FmtSubscriber::builder() |
66 |
| - .with_line_number(true) |
67 |
| - .with_max_level(Level::TRACE) |
68 |
| - .finish(); |
69 |
| - tracing::subscriber::set_global_default(subscriber)?; |
70 |
| - } |
71 | 16 |
|
72 | 17 | io.ns("/", on_connect);
|
73 | 18 |
|
74 | 19 | let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
|
75 | 20 | let listener = TcpListener::bind(addr).await?;
|
76 | 21 |
|
77 |
| - #[cfg(feature = "custom-report")] |
78 |
| - tokio::task::spawn(async move { |
79 |
| - loop { |
80 |
| - tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await; |
81 |
| - MEMORY.lock().unwrap().push(( |
82 |
| - Instant::now(), |
83 |
| - SOCKETS_CNT.load(std::sync::atomic::Ordering::Relaxed), |
84 |
| - CURRENT.load(std::sync::atomic::Ordering::Relaxed), |
85 |
| - )); |
86 |
| - } |
87 |
| - }); |
88 |
| - |
89 |
| - #[cfg(feature = "custom-report")] |
90 |
| - tokio::task::spawn(async move { |
91 |
| - tokio::signal::ctrl_c().await.unwrap(); |
92 |
| - println!("saving charts..."); |
93 |
| - let points = MEMORY.lock().unwrap(); |
94 |
| - let mut time: Vec<String> = Vec::with_capacity(points.len()); |
95 |
| - let mut sockets: Vec<String> = Vec::with_capacity(points.len()); |
96 |
| - let mut memory: Vec<f32> = Vec::with_capacity(points.len()); |
97 |
| - for (t, s, m) in points.iter() { |
98 |
| - time.push(t.elapsed().as_secs_f64().to_string()); |
99 |
| - sockets.push(s.to_string()); |
100 |
| - memory.push(*m as f32); |
101 |
| - } |
102 |
| - let line_chart = LineChart::new(vec![("Memory", memory).into()], sockets); |
103 |
| - let svg = line_chart.svg().unwrap(); |
104 |
| - std::fs::write("memory_usage.svg", svg).unwrap(); |
105 |
| - std::process::exit(0); |
106 |
| - }); |
107 |
| - |
108 | 22 | loop {
|
109 | 23 | let (stream, _) = listener.accept().await?;
|
110 | 24 |
|
|
0 commit comments