move loop out of update_state()

This commit is contained in:
Miroslav Lichvar 2018-12-09 20:05:49 +01:00
parent 9735b4804a
commit a7427578ad
1 changed files with 48 additions and 49 deletions

View File

@ -352,66 +352,61 @@ impl NtpServer {
} }
fn update_state(state: Arc<Mutex<NtpServerState>>, addr: SocketAddr, debug: bool) { fn update_state(state: Arc<Mutex<NtpServerState>>, addr: SocketAddr, debug: bool) {
loop { let udp_builder = UdpBuilder::new_v4().unwrap();
let udp_builder = UdpBuilder::new_v4().unwrap(); let socket = udp_builder.bind("0.0.0.0:0").unwrap();
let socket = udp_builder.bind("0.0.0.0:0").unwrap(); let request = NtpPacket::new_request(addr);
let request = NtpPacket::new_request(addr); let mut new_state: Option<NtpServerState> = None;
let mut new_state: Option<NtpServerState> = None;
socket.set_read_timeout(Some(Duration::new(1, 0))).unwrap(); socket.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
match request.send(&socket) { match request.send(&socket) {
Ok(_) => { Ok(_) => {
if debug { if debug {
println!("Client sent {:?}", request); println!("Client sent {:?}", request);
}
},
Err(e) => panic!("Client failed to send packet: {}", e)
}
loop {
let response = match NtpPacket::receive(&socket) {
Ok(packet) => {
if debug {
println!("Client received {:?}", packet);
}
if !packet.is_valid_response(&request) {
println!("Client received unexpected {:?}", packet);
continue;
}
packet
},
Err(e) => {
if debug {
println!("Client failed to receive packet: {}", e);
}
break;
}
};
new_state = Some(response.get_server_state());
break;
}
if let Ok(mut state) = state.lock() {
if let Some(new_state) = new_state {
*state = new_state;
} }
},
Err(e) => panic!("Client failed to send packet: {}", e)
}
state.dispersion.increment(); loop {
let response = match NtpPacket::receive(&socket) {
Ok(packet) => {
if debug {
println!("Client received {:?}", packet);
}
if !packet.is_valid_response(&request) {
println!("Client received unexpected {:?}", packet);
continue;
}
packet
},
Err(e) => {
if debug {
println!("Client failed to receive packet: {}", e);
}
break;
}
};
new_state = Some(response.get_server_state());
break;
}
if let Ok(mut state) = state.lock() {
if let Some(new_state) = new_state {
*state = new_state;
} }
if let Some(_) = new_state { state.dispersion.increment();
thread::sleep(Duration::new(1, 0));
}
} }
} }
fn run(&self) { fn run(&self) {
let mut threads = vec![]; let mut threads = vec![];
let mut id = 0; let mut id = 0;
let quit = false;
for socket in &self.sockets { for socket in &self.sockets {
id = id + 1; id = id + 1;
@ -422,7 +417,11 @@ impl NtpServer {
threads.push(thread::spawn(move || {NtpServer::process_requests(id, debug, cloned_socket, state); })); threads.push(thread::spawn(move || {NtpServer::process_requests(id, debug, cloned_socket, state); }));
} }
NtpServer::update_state(self.state.clone(), self.server_addr.parse().unwrap(), self.debug); while ! quit {
NtpServer::update_state(self.state.clone(), self.server_addr.parse().unwrap(), self.debug);
thread::sleep(Duration::new(1, 0));
}
for thread in threads { for thread in threads {
let _ = thread.join(); let _ = thread.join();