mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 12:24:45 +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::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.")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue