|
|
|
|
@ -4,6 +4,8 @@ use std::collections::HashMap;
|
|
|
|
|
use std::io::{self, prelude::*};
|
|
|
|
|
use std::net::{TcpListener, TcpStream};
|
|
|
|
|
use std::os::unix::io::{AsRawFd, RawFd};
|
|
|
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
|
macro_rules! syscall {
|
|
|
|
|
@ -27,6 +29,9 @@ const READ_FLAGS: i32 = libc::EPOLLONESHOT | libc::EPOLLIN;
|
|
|
|
|
const WRITE_FLAGS: i32 = libc::EPOLLONESHOT | libc::EPOLLOUT;
|
|
|
|
|
|
|
|
|
|
fn main() -> io::Result<()> {
|
|
|
|
|
let term = Arc::new(AtomicBool::new(false));
|
|
|
|
|
signal_hook::flag::register(signal_hook::consts::SIGINT, Arc::clone(&term))?;
|
|
|
|
|
|
|
|
|
|
let mut request_contexts: HashMap<u64, RequestContext> = HashMap::new();
|
|
|
|
|
let mut events: Vec<libc::epoll_event> = Vec::with_capacity(1024);
|
|
|
|
|
let mut key = 100;
|
|
|
|
|
@ -39,7 +44,12 @@ fn main() -> io::Result<()> {
|
|
|
|
|
add_interest(epoll_fd, listener_fd, listener_read_event(key))?;
|
|
|
|
|
|
|
|
|
|
loop {
|
|
|
|
|
println!("\nrequests in flight: {}", request_contexts.len());
|
|
|
|
|
// check signal and 0 contexts
|
|
|
|
|
if term.load(Ordering::Relaxed) && request_contexts.len() == 0 {
|
|
|
|
|
println!("received sigterm, queue is empty, shutting down..");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
//println!("\nrequests in flight: {}", request_contexts.len());
|
|
|
|
|
events.clear();
|
|
|
|
|
let res = match syscall!(epoll_wait(
|
|
|
|
|
epoll_fd,
|
|
|
|
|
@ -48,6 +58,7 @@ fn main() -> io::Result<()> {
|
|
|
|
|
1000 as libc::c_int,
|
|
|
|
|
)) {
|
|
|
|
|
Ok(v) => v,
|
|
|
|
|
Err(e) if e.kind() == io::ErrorKind::Interrupted => continue,
|
|
|
|
|
Err(e) => panic!("error during epoll wait: {}", e),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -67,7 +78,11 @@ fn main() -> io::Result<()> {
|
|
|
|
|
}
|
|
|
|
|
Err(e) => eprintln!("couldn't accept: {}", e),
|
|
|
|
|
};
|
|
|
|
|
modify_interest(epoll_fd, listener_fd, listener_read_event(100))?;
|
|
|
|
|
if !term.load(Ordering::Relaxed) {
|
|
|
|
|
modify_interest(epoll_fd, listener_fd, listener_read_event(100))?;
|
|
|
|
|
} else {
|
|
|
|
|
println!("received sigterm, not accepting new incoming connections");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
key => {
|
|
|
|
|
let mut to_delete = None;
|
|
|
|
|
@ -91,6 +106,7 @@ fn main() -> io::Result<()> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn epoll_create() -> io::Result<RawFd> {
|
|
|
|
|
|