allow multiple REPL at once by seeking free port before server set up

This commit is contained in:
Yuna Tomida 2022-08-27 11:27:30 +09:00
parent 6b7410100d
commit 9210188b71
No known key found for this signature in database
GPG key ID: E6EC40A47CA07A6F
2 changed files with 22 additions and 7 deletions

View file

@ -1,6 +1,6 @@
use std::fs::remove_file; use std::fs::remove_file;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::net::TcpStream; use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream};
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
@ -30,12 +30,12 @@ impl Runnable for DummyVM {
fn new(cfg: ErgConfig) -> Self { fn new(cfg: ErgConfig) -> Self {
let stream = if cfg.input.is_repl() { let stream = if cfg.input.is_repl() {
println!("Starting the REPL server..."); println!("Starting the REPL server...");
let code = include_str!("scripts/repl_server.py"); let port = find_available_port();
exec_py(code); let code = include_str!("scripts/repl_server.py")
.replace("__PORT__", port.to_string().as_str());
exec_py(&code);
let addr = SocketAddrV4::new(Ipv4Addr::LOCALHOST, port);
println!("Connecting to the REPL server..."); println!("Connecting to the REPL server...");
let repl_server_ip = "127.0.0.1";
let repl_server_port = 8736;
let addr = format!("{repl_server_ip}:{repl_server_port}");
loop { loop {
match TcpStream::connect(&addr) { match TcpStream::connect(&addr) {
Ok(stream) => { Ok(stream) => {
@ -128,3 +128,17 @@ impl Runnable for DummyVM {
Ok(res) Ok(res)
} }
} }
fn find_available_port() -> u16 {
const DEFAULT_PORT: u16 = 8736;
TcpListener::bind(SocketAddrV4::new(Ipv4Addr::LOCALHOST, DEFAULT_PORT))
.is_ok()
.then_some(DEFAULT_PORT)
.unwrap_or_else(|| {
let socket = SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0);
TcpListener::bind(socket)
.and_then(|listener| listener.local_addr())
.map(|sock_addr| sock_addr.port())
.expect("No free port found.")
})
}

View file

@ -6,7 +6,8 @@ import importlib as __importlib
import io as __io import io as __io
__server_socket = __socket.socket() __server_socket = __socket.socket()
__server_socket.bind(('0.0.0.0', 8736)) # DummyVM will replace this __PORT__ with free port
__server_socket.bind(('127.0.0.1', __PORT__))
__server_socket.listen(1) __server_socket.listen(1)
(__client_socket, __client_address) = __server_socket.accept() (__client_socket, __client_address) = __server_socket.accept()