1use ntex_util::services::Counter;
3use std::sync::atomic::{AtomicUsize, Ordering};
4
5mod accept;
6mod builder;
7mod config;
8mod factory;
9mod service;
10mod socket;
11mod test;
12
13pub use self::accept::{AcceptLoop, AcceptNotify, AcceptorCommand};
14pub use self::builder::{bind_addr, create_tcp_listener, ServerBuilder};
15pub use self::config::{Config, ServiceConfig, ServiceRuntime};
16pub use self::service::StreamServer;
17pub use self::socket::{Connection, Stream};
18pub use self::test::{build_test_server, test_server, TestServer};
19
20pub type Server = crate::Server<Connection>;
21
22#[non_exhaustive]
23#[derive(Copy, Clone, Debug, PartialEq, Eq)]
24pub enum ServerStatus {
26 Ready,
27 NotReady,
28 WorkerFailed,
29}
30
31#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
33pub struct Token(usize);
34
35impl Token {
36 #[allow(clippy::should_implement_trait)]
37 pub fn next(&mut self) -> Token {
38 let token = Token(self.0);
39 self.0 += 1;
40 token
41 }
42}
43
44pub fn build() -> ServerBuilder {
46 ServerBuilder::default()
47}
48
49#[derive(Debug)]
51pub enum SslError<E> {
52 Ssl(Box<dyn std::error::Error>),
53 Service(E),
54}
55
56static MAX_CONNS: AtomicUsize = AtomicUsize::new(25600);
57
58thread_local! {
59 static MAX_CONNS_COUNTER: Counter = Counter::new(MAX_CONNS.load(Ordering::Relaxed));
60}
61
62pub(super) fn max_concurrent_connections(num: usize) {
69 MAX_CONNS.store(num, Ordering::Relaxed);
70 MAX_CONNS_COUNTER.with(|conns| conns.set_capacity(num));
71}
72
73pub(super) fn num_connections() -> usize {
74 MAX_CONNS_COUNTER.with(|conns| conns.total())
75}