feat: M3 mosh 挂起→恢复<3s(唤醒脉冲 + 会话状态机三相)
- SessionMachine 加 mosh 三相(moshActive/moshParked/moshResuming)+看门狗兜底, mosh 接管即拆 SSH、后台冻结不重建、前台唤醒脉冲等 SSP 续(+5 单测) - bridge.go: Node.WakeUp()(tsnet InjectEvent+MagicSock.Rebind/ReSTUN) + MoshRelay.Rebind()(同端口重开 loopback、泵按 socket 生成容错) - iosclient.cc: g_mosh_last_heard 探针(导出 mosh_last_heard_ms) + SIGCONT 全屏重绘 - MoshSession: nudge()(SIGCONT) + lastHeardMs();SSHTerminalModel 前台脉冲三连 + healthy 轮询 + beginBackgroundTask;URL scheme 供无头前台唤醒 - 验证(vohive-vm over tsnet):15s 冻结→前台 wake pulse→1.3s recovered,<3s Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
19
vendor/mosh/src/frontend/iosclient.cc
vendored
19
vendor/mosh/src/frontend/iosclient.cc
vendored
@@ -62,6 +62,16 @@
|
||||
|
||||
#include "networktransport.cc"
|
||||
|
||||
#include <atomic>
|
||||
#include <stdint.h>
|
||||
|
||||
/* M3 探针:记录最近一次收到服务器数据报的时刻(mosh 单调 timestamp() ms)。
|
||||
* process_network_input 仅在网络 socket 可读时调用,loopback 上只有服务器经 relay 转来的包,
|
||||
* 故"进入该函数"≈"听到服务器"(含纯 ack,空闲屏幕也能检出恢复)。
|
||||
* Swift 侧前台恢复时记基线值、轮询其增长 → 判定 SSP 已续("healthy")。跨线程用 atomic。 */
|
||||
std::atomic<uint64_t> g_mosh_last_heard_ms{ 0 };
|
||||
extern "C" unsigned long long mosh_last_heard_ms( void ) { return (unsigned long long)g_mosh_last_heard_ms.load(); }
|
||||
|
||||
void iOSClient::resume( void )
|
||||
{
|
||||
/* Restore termios state */
|
||||
@@ -73,8 +83,8 @@ void iOSClient::resume( void )
|
||||
// /* Put terminal in application-cursor-key mode */
|
||||
// swrite( out_fd, display.open().c_str() );
|
||||
|
||||
// /* Flag that outer terminal state is unknown */
|
||||
// repaint_requested = true;
|
||||
/* M3:SIGCONT(前台唤醒)→ 标记外层终端状态未知,下一帧全屏重绘。 */
|
||||
repaint_requested = true;
|
||||
}
|
||||
|
||||
void iOSClient::init( void )
|
||||
@@ -284,7 +294,10 @@ void iOSClient::output_new_frame( void )
|
||||
void iOSClient::process_network_input( void )
|
||||
{
|
||||
network->recv();
|
||||
|
||||
|
||||
/* M3 探针:收到服务器数据报 → 记录时刻供前台恢复判定(见上方说明)。 */
|
||||
g_mosh_last_heard_ms.store( timestamp() );
|
||||
|
||||
/* Now give hints to the overlays */
|
||||
overlays.get_notification_engine().server_heard( network->get_latest_remote_state().timestamp );
|
||||
overlays.get_notification_engine().server_acked( network->get_sent_state_acked_timestamp() );
|
||||
|
||||
6
vendor/mosh/src/frontend/moshiosbridge.h
vendored
6
vendor/mosh/src/frontend/moshiosbridge.h
vendored
@@ -10,4 +10,10 @@ extern "C"
|
||||
int mosh_main(FILE *f_in, FILE *f_out, struct winsize *window_size,
|
||||
const char *ip, const char *port, const char *key, const char *predict_mode);
|
||||
|
||||
/* M3:最近一次收到新服务器状态的 mosh 单调时刻(ms);0=从未。前台恢复判定用。 */
|
||||
#if __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
unsigned long long mosh_last_heard_ms(void);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user