in dc/s2n-quic-dc/src/stream/environment/tokio/pool.rs [207:256]
fn create_workers(mut options: Options, config: &Config) -> Result<Vec<Socket>> {
let mut sockets = vec![];
let stream_cap = config.stream_queue;
let control_cap = config.control_queue;
let shared_queue = if config.reuse_port {
// if we are reusing the port, we need to share the queue_ids
Some(Queues::new_non_zero(stream_cap, control_cap))
} else {
// otherwise, each worker can get its own queue to reduce thread contention
None
};
let workers = config.workers.unwrap_or(1).max(1);
for i in 0..workers {
let socket = if i == 0 && workers > 1 {
if config.reuse_port {
// set reuse port after we bind for the first socket
options.reuse_port = ReusePort::AfterBind;
}
let socket = options.build_udp()?;
if config.reuse_port {
// for any additional sockets, set reuse port before bind
options.reuse_port = ReusePort::BeforeBind;
// in case the application bound to a wildcard, resolve the local address
options.addr = socket.local_addr()?;
}
socket
} else {
options.build_udp()?
};
let queue = if let Some(shared_queue) = &shared_queue {
shared_queue.clone()
} else {
Queues::new(stream_cap, control_cap)
};
let socket = Socket::new(socket, queue)?;
sockets.push(socket);
}
Ok(sockets)
}