1use std::sync::atomic::{AtomicUsize, Ordering};
3
4use ntex_io::Io;
5use ntex_service::state::State;
6use ntex_util::services::Counter;
7
8mod accept;
9mod builder;
10mod config;
11mod factory;
12mod service;
13mod socket;
14mod state;
15mod test;
16
17pub use self::accept::{AcceptLoop, AcceptNotify, AcceptorCommand};
18pub use self::builder::{ServerBuilder, bind_addr, create_tcp_listener};
19pub use self::config::{ServiceConfig, ServiceRuntime};
20pub use self::service::StreamServer;
21pub use self::socket::{Connection, Stream};
22pub use self::test::{TestServer, TestServerBuilder, build_test_server, test_server};
23
24pub type Server = crate::Server<Connection>;
25
26#[non_exhaustive]
27#[derive(Copy, Clone, Debug, PartialEq, Eq)]
28pub enum ServerStatus {
30 Ready,
31 NotReady,
32 WorkerFailed,
33}
34
35#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
37pub struct Token(usize);
38
39impl Token {
40 #[must_use]
41 #[allow(clippy::should_implement_trait)]
42 pub fn next(&mut self) -> Token {
43 let token = Token(self.0);
44 self.0 += 1;
45 token
46 }
47}
48
49pub fn build() -> ServerBuilder {
51 ServerBuilder::default()
52}
53
54pub fn build_with_state<F, St>(state: F) -> ServerBuilder<St>
56where
57 F: AsyncFn() -> Result<St, &'static str> + Send + Clone + 'static,
58 St: State<St, Io> + Clone + 'static,
59{
60 ServerBuilder::new(state)
61}
62
63static MAX_CONNS: AtomicUsize = AtomicUsize::new(25600);
64
65thread_local! {
66 static MAX_CONNS_COUNTER: Counter = Counter::new(MAX_CONNS.load(Ordering::Relaxed));
67}
68
69pub(super) fn max_concurrent_connections(num: usize) {
76 MAX_CONNS.store(num, Ordering::Relaxed);
77 MAX_CONNS_COUNTER.with(|conns| conns.set_capacity(num));
78}
79
80pub(super) fn num_connections() -> usize {
81 MAX_CONNS_COUNTER.with(Counter::total)
82}