From 8bbaf85c8ccaab88fd27229686a03e3ed7b94e22 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Tue, 22 Sep 2026 13:32:40 -0400 Subject: Fix fig client Previously, we were only reading at most 1024 bytes per frame. This was not ideal --- crates/teleia/src/net/fig.rs | 26 ++++++++++++-------------- crates/teleia/src/script.rs | 6 +++++- 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'crates') diff --git a/crates/teleia/src/net/fig.rs b/crates/teleia/src/net/fig.rs index d49e498..3bf9a35 100644 --- a/crates/teleia/src/net/fig.rs +++ b/crates/teleia/src/net/fig.rs @@ -69,24 +69,22 @@ impl BinaryClient { self.in_buf.drain(..len); Some(BinaryMessage { event, data }) } - fn try_read(&mut self) -> Erm<()> { - let mut buf = [0; 1024]; + fn try_read(&mut self) -> Erm { + let mut buf = [0; 8192]; match self.socket.read(&mut buf) { - Ok(sz) => self.in_buf.extend_from_slice(&buf[..sz]), - Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {}, - e => { e.wrap_err("failed to read from bus socket")?; }, + Ok(sz) => { self.in_buf.extend_from_slice(&buf[..sz]); Ok(true) }, + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => Ok(false), + e => { e.wrap_err("failed to read from bus socket")?; Ok(false) }, } - Ok(()) } - fn try_write(&mut self) -> Erm<()> { + fn try_write(&mut self) -> Erm { if !self.out_buf.is_empty() { match self.socket.write(&self.out_buf) { - Ok(sz) => { self.out_buf.drain(..sz); }, - Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {}, - e => { e.wrap_err("failed to write to bus socket")?; }, + Ok(sz) => { self.out_buf.drain(..sz); Ok(true) }, + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => Ok(false), + e => { e.wrap_err("failed to write to bus socket")?; Ok(false) }, } - } - Ok(()) + } else { Ok(false) } } fn resubscribe(&mut self) -> Erm<()> { self.poller.modify(&self.socket, polling::Event::readable(KEY)).wrap_err("failed to update event to poll")?; @@ -98,8 +96,8 @@ impl BinaryClient { fn process_events(&mut self, events: &mut polling::Events) -> Erm<()> { for ev in events.iter() { if ev.key == KEY { - if ev.readable { self.try_read()?; } - if ev.writable { self.try_write()?; } + if ev.readable { while self.try_read()? {} } + if ev.writable { while self.try_write()? {} } } } Ok(()) diff --git a/crates/teleia/src/script.rs b/crates/teleia/src/script.rs index c92f821..a6d0d03 100644 --- a/crates/teleia/src/script.rs +++ b/crates/teleia/src/script.rs @@ -77,6 +77,8 @@ unsafe extern "C" { fn pit_parse(rt: *mut PitRuntime, parser: *mut PitParser, eof: *mut bool) -> PitValue; fn pit_dump(rt: *mut PitRuntime, buf: *mut u8, len: i64, v: PitValue, readable: bool) -> i64; + fn pit_compile(rt: *mut PitRuntime, v: PitValue) -> PitValue; + fn pit_vm_eval(rt: *mut PitRuntime, v: PitValue) -> PitValue; fn pit_vm_apply(rt: *mut PitRuntime, f: PitValue, args: PitValue) -> PitValue; @@ -150,7 +152,9 @@ impl Runtime { } pub fn eval(&mut self, v: Value) -> utils::Erm { unsafe { - let ret = pit_vm_eval(self.rt, v.val); + let code = pit_compile(self.rt, v.val); + self.error()?; + let ret = pit_vm_eval(self.rt, code); self.error()?; Ok(Value { val: ret }) } -- cgit v1.3.1