d3_components/
network_start_stop.rs1#![allow(dead_code)]
2use super::*;
3
4use crate::mio_network::new_network_factory;
5
6#[allow(non_upper_case_globals)]
11static network_state: AtomicCell<NetworkState> = AtomicCell::new(NetworkState::Stopped);
12
13#[allow(non_upper_case_globals)]
14static network: AtomicRefCell<Network> = AtomicRefCell::new(Network {
15 network_control: NetworkField::Uninitialized,
16 network_sender: NetworkField::Uninitialized,
17});
18
19#[derive(Debug, Copy, Clone, Eq, PartialEq, SmartDefault)]
21enum NetworkState {
22 #[default]
23 Stopped,
24 Initializing,
25 Stopping,
26 Running,
27}
28
29#[derive(SmartDefault)]
33enum NetworkField {
34 #[default]
35 Uninitialized,
36 Network(NetworkControlObj),
37 NetworkSender(NetSender),
38}
39
40#[derive(SmartDefault)]
43struct Network {
44 network_control: NetworkField,
45 network_sender: NetworkField,
46}
47impl Network {
48 fn get_sender() -> NetSender {
50 match &network.borrow().network_sender {
51 NetworkField::NetworkSender(network_sender) => network_sender.clone(),
52 _ => panic!("network is not running, unable to get sender."),
53 }
54 }
55}
56
57#[inline]
58pub fn get_network_sender() -> NetSender { Network::get_sender() }
62
63pub fn start_network() {
66 network_state.store(NetworkState::Initializing);
67 let network_factory = new_network_factory();
68 let network_sender = network_factory.get_sender();
69 let network_control = network_factory.start();
70 let mut s = network.borrow_mut();
71 s.network_control = NetworkField::Network(network_control);
72 s.network_sender = NetworkField::NetworkSender(network_sender);
73 network_state.store(NetworkState::Running);
74}
75
76pub fn stop_network() {
79 network_state.store(NetworkState::Stopping);
80 if let NetworkField::Network(network_control) = &(network.borrow()).network_control {
81 network_control.stop()
82 }
83
84 let mut s = network.borrow_mut();
85 s.network_control = NetworkField::Uninitialized;
86 s.network_sender = NetworkField::Uninitialized;
87 network_state.store(NetworkState::Stopped);
88 thread::sleep(Duration::from_millis(100));
90}
91
92pub trait NetworkFactory {
94 fn get_sender(&self) -> NetSender;
96 fn start(&self) -> NetworkControlObj;
98}
99pub type NetworkFactoryObj = Arc<dyn NetworkFactory>;
101
102pub trait NetworkControl: Send + Sync {
104 fn stop(&self);
106}
107pub type NetworkControlObj = Arc<dyn NetworkControl>;