prewarm wrapper should indicate it is active via the process environment

This commit is contained in:
Kovid Goyal 2022-07-20 21:15:51 +05:30
parent 67cb466ea9
commit f7a7e39a36
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 21 additions and 7 deletions

View File

@ -107,12 +107,20 @@ def socket_child_main(exit_code=0, initial_print=''):
pty.wait_till(lambda: 'SIGTSTP received' in pty.screen_contents()) pty.wait_till(lambda: 'SIGTSTP received' in pty.screen_contents())
wait_for_death(19) wait_for_death(19)
with self.subTest(msg='test SIGWINCH handling'): with self.subTest(msg='test SIGWINCH handling'):
pty = self.create_pty(
argv=[kitty_exe(), '+runpy', src + 'socket_child_main(initial_print="child ready:")'], cols=cols, env=env, cwd=cwd)
pty.wait_till(lambda: 'child ready:' in pty.screen_contents())
pty.set_window_size(columns=cols + 3)
pty.wait_till(lambda: f'Screen size changed: {cols + 3}' in pty.screen_contents())
os.close(pty.master_fd)
with self.subTest(msg='test env rewrite'):
pty = self.create_pty( pty = self.create_pty(
argv=[kitty_exe(), '+runpy', src + 'socket_child_main(initial_print="child ready:")'], cols=cols, env=env, cwd=cwd) argv=[kitty_exe(), '+runpy', src + 'socket_child_main(initial_print="child ready:")'], cols=cols, env=env, cwd=cwd)
pty.wait_till(lambda: 'child ready:' in pty.screen_contents()) pty.wait_till(lambda: 'child ready:' in pty.screen_contents())
pty.set_window_size(columns=cols + 3) from kitty.child import environ_of_process
pty.wait_till(lambda: f'Screen size changed: {cols + 3}' in pty.screen_contents()) self.assertTrue(environ_of_process(pty.child_pid).get('KITTY_PWPR'))
os.close(pty.master_fd) os.close(pty.master_fd)
with self.subTest(msg='test passing of data via cwd, env vars and stdin/stdout redirection'): with self.subTest(msg='test passing of data via cwd, env vars and stdin/stdout redirection'):

View File

@ -268,11 +268,11 @@ read_exe_path(char *exe, size_t buf_sz) {
} }
#endif // }}} #endif // }}}
extern void use_prewarmed_process(int argc, char *argv[]); extern void use_prewarmed_process(int argc, char *argv[], char *envp[]);
int main(int argc, char *argv[]) { int main(int argc, char *argv[], char* envp[]) {
if (argc < 1 || !argv) { fprintf(stderr, "Invalid argc/argv\n"); return 1; } if (argc < 1 || !argv) { fprintf(stderr, "Invalid argc/argv\n"); return 1; }
use_prewarmed_process(argc, argv); use_prewarmed_process(argc, argv, envp);
char exe[PATH_MAX+1] = {0}; char exe[PATH_MAX+1] = {0};
char exe_dir_buf[PATH_MAX+1] = {0}; char exe_dir_buf[PATH_MAX+1] = {0};
FREE_AFTER_FUNCTION const char *lc_ctype = NULL; FREE_AFTER_FUNCTION const char *lc_ctype = NULL;

View File

@ -673,7 +673,7 @@ check_socket_addr(char *addr) {
} }
void void
use_prewarmed_process(int argc, char *argv[]) { use_prewarmed_process(int argc, char *argv[], char *envp[]) {
char *env_addr = getenv("KITTY_PREWARM_SOCKET"); char *env_addr = getenv("KITTY_PREWARM_SOCKET");
if (!env_addr || !*env_addr || !is_prewarmable(argc, argv)) return; if (!env_addr || !*env_addr || !is_prewarmable(argc, argv)) return;
env_addr = check_socket_addr(env_addr); env_addr = check_socket_addr(env_addr);
@ -698,6 +698,12 @@ use_prewarmed_process(int argc, char *argv[]) {
to_child_tty.buf = from_child_tty.buf + IO_BUZ_SZ; to_child_tty.buf = from_child_tty.buf + IO_BUZ_SZ;
#undef fail #undef fail
while (*envp) {
if (strncmp(*envp, "KITTY_PREWARM_SOCKET=", 2) == 0) {
sprintf(*envp, "KITTY_PWPR=%s", child_tty_name);
}
envp++;
}
loop(); loop();
flush_data(); flush_data();
cleanup(); cleanup();