From a6e4dc97a4e48373719b9be64c73274131890c04 Mon Sep 17 00:00:00 2001 From: Godopu Date: Thu, 16 Jul 2026 23:19:24 +0900 Subject: [PATCH] fix(ui): prevent Dart event loop freezing by switching master PTY fd to non-blocking mode via fcntl --- .../test/incremental_kernel.Ly9AZGFydD0zLjA= | Bin 4028768 -> 4028768 bytes .../test/incremental_kernel.Ly9AZGFydD0zLjA= | Bin 4057704 -> 4058736 bytes .../packages/mam_pty/lib/src/pty_session.dart | 11 +++++++++++ 3 files changed, 11 insertions(+) diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= b/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= index b60dfb09ce956f3919efaa45592d2e1af94c7b28..971d7b4054aae59b8a13984b94cc8d33f4e4c69e 100644 GIT binary patch delta 182 zcmXxZHwwZ4069c)cQr~ F7(RoHJ+=S< diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= b/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= index 73440f4ce34d3cabc7e61d7e23fdec7a10e95781..e6f48d0a5be710dd4762e2617bca76c45f63ea6b 100644 GIT binary patch delta 16056 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 delta 15052 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 status, int typedef _chdir_c = ffi.Int32 Function(ffi.Pointer path); typedef _chdir_dart = int Function(ffi.Pointer path); +typedef _fcntl_c = ffi.Int32 Function(ffi.Int32 fd, ffi.Int32 cmd, ffi.Int32 arg); +typedef _fcntl_dart = int Function(int fd, int cmd, int arg); + base class Winsize extends ffi.Struct { @ffi.Uint16() external int ws_row; @@ -97,6 +100,7 @@ class PtySession { final execvp = libc.lookupFunction<_execvp_c, _execvp_dart>('execvp'); final ioctl = libc.lookupFunction<_ioctl_c, _ioctl_dart>('ioctl'); final chdir = libc.lookupFunction<_chdir_c, _chdir_dart>('chdir'); + final fcntl = libc.lookupFunction<_fcntl_c, _fcntl_dart>('fcntl'); // 1. Prepare master PTY final masterFd = posixOpenpt(2 | 0x00000400); @@ -121,6 +125,13 @@ class PtySession { } final slaveName = slavePtr.cast().toDartString(); + // Set master fd to non-blocking mode to prevent freezing the Dart event loop (§6.7) + // F_GETFL = 3, F_SETFL = 4, O_NONBLOCK = 2048 (0x800) + final flags = fcntl(masterFd, 3, 0); + if (flags >= 0) { + fcntl(masterFd, 4, flags | 2048); + } + // 2. Resolve environment, isolating nested TMUX contexts (§6.7) final env = Map.from(environment ?? Platform.environment); env.remove('TMUX');