mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 12:51:10 +00:00
allow multiple REPL at once by seeking free port before server set up
This commit is contained in:
parent
6b7410100d
commit
9210188b71
2 changed files with 22 additions and 7 deletions
26
src/dummy.rs
26
src/dummy.rs
|
@ -1,6 +1,6 @@
|
|||
use std::fs::remove_file;
|
||||
use std::io::{Read, Write};
|
||||
use std::net::TcpStream;
|
||||
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream};
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
|
||||
|
@ -30,12 +30,12 @@ impl Runnable for DummyVM {
|
|||
fn new(cfg: ErgConfig) -> Self {
|
||||
let stream = if cfg.input.is_repl() {
|
||||
println!("Starting the REPL server...");
|
||||
let code = include_str!("scripts/repl_server.py");
|
||||
exec_py(code);
|
||||
let port = find_available_port();
|
||||
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...");
|
||||
let repl_server_ip = "127.0.0.1";
|
||||
let repl_server_port = 8736;
|
||||
let addr = format!("{repl_server_ip}:{repl_server_port}");
|
||||
loop {
|
||||
match TcpStream::connect(&addr) {
|
||||
Ok(stream) => {
|
||||
|
@ -128,3 +128,17 @@ impl Runnable for DummyVM {
|
|||
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.")
|
||||
})
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@ import importlib as __importlib
|
|||
import io as __io
|
||||
|
||||
__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)
|
||||
(__client_socket, __client_address) = __server_socket.accept()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue