1use std::sync::atomic::{AtomicUsize, Ordering};
7
8use ntex_util::services::Counter;
9
10mod accept;
11mod builder;
12mod config;
13mod factory;
14mod service;
15mod socket;
16mod test;
17
18pub use crate::{
19 Affinity, ListenerMetrics, LoadBalancing, NoConfig, RuntimeMetrics, ServerAppConfig,
20 ServerMetrics, ServerStatus, WorkerMetrics,
21};
22
23pub use self::accept::{AcceptLoop, AcceptNotify, AcceptorCommand};
24pub use self::builder::{ServerBuilder, bind_addr, create_tcp_listener};
25pub use self::config::{ServiceConfig, ServiceRuntime};
26pub use self::service::StreamServer;
27pub use self::socket::{Connection, Stream};
28pub use self::test::{TestServer, TestServerBuilder, build_test_server, test_server};
29
30pub type Server = crate::Server<Connection>;
32
33#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
35pub struct Token(usize);
36
37impl Token {
38 #[must_use]
39 #[allow(clippy::should_implement_trait)]
40 pub fn next(&mut self) -> Token {
42 let token = Token(self.0);
43 self.0 += 1;
44 token
45 }
46}
47
48pub fn build() -> ServerBuilder {
50 ServerBuilder::default()
51}
52
53pub fn build_with_config<Cfg>(state: Cfg) -> ServerBuilder<Cfg>
55where
56 Cfg: ServerAppConfig,
57{
58 ServerBuilder::new(state)
59}
60
61static MAX_CONNS: AtomicUsize = AtomicUsize::new(25600);
62
63thread_local! {
64 static MAX_CONNS_COUNTER: Counter = Counter::new(MAX_CONNS.load(Ordering::Relaxed));
65}
66
67pub(super) fn max_concurrent_connections(num: usize) {
71 MAX_CONNS.store(num, Ordering::Relaxed);
72 MAX_CONNS_COUNTER.with(|conns| conns.set_capacity(num));
73}
74
75pub(super) fn num_connections() -> usize {
76 MAX_CONNS_COUNTER.with(Counter::total)
77}
78
79#[cfg(test)]
80mod tests {
81 use super::*;
82
83 #[test]
84 fn token_next() {
85 let mut token = Token(0);
86 assert_eq!(token.next(), Token(0));
87 assert_eq!(token.next(), Token(1));
88 assert_eq!(token, Token(2));
89 }
90}