Do not use prewarming for wrapped kittens

This commit is contained in:
Kovid Goyal 2023-01-23 15:21:04 +05:30
parent 35c1ebd3f9
commit 0903ae7b4d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 32 additions and 11 deletions

View File

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, DefaultDict, Dict, Generator, List, Optional,
import kitty.fast_data_types as fast_data_types
from .constants import handled_signals, is_freebsd, is_macos, kitten_exe, kitty_base_dir, shell_path, terminfo_dir
from .constants import handled_signals, is_freebsd, is_macos, kitten_exe, kitty_base_dir, shell_path, terminfo_dir, wrapped_kitten_names
from .types import run_once
from .utils import log_error, which
@ -185,16 +185,31 @@ class ProcessDesc(TypedDict):
cmdline: Optional[Sequence[str]]
def is_prewarmable(argv: Sequence[str]) -> bool:
def is_prewarmable(argv: List[str]) -> Tuple[bool, List[str]]:
if len(argv) < 3 or os.path.basename(argv[0]) != 'kitty':
return False
if argv[1][:1] not in '@+':
return False
if argv[1][0] == '@':
return True
return False, argv
if argv[1][:1] != '+':
return False, argv
sw = ''
if argv[1] == '+':
return argv[2] != 'open'
return argv[1] != '+open'
which = argv[2]
if len(argv) > 3:
sw = argv[3]
else:
which = argv[1][1:]
if len(argv) > 2:
sw = argv[2]
if which == 'open':
return False, argv
if which == 'kitten' and sw in wrapped_kitten_names():
argv = list(argv)
argv[0] = kitten_exe()
if argv[1] == '+':
del argv[1:3]
else:
del argv[1]
return False, argv
return True, argv
@run_once
@ -281,7 +296,7 @@ class Child:
self.forked = True
master, slave = openpty()
stdin, self.stdin = self.stdin, None
self.is_prewarmed = is_prewarmable(self.argv)
self.is_prewarmed, self.argv = is_prewarmable(self.argv)
if not self.is_prewarmed:
ready_read_fd, ready_write_fd = os.pipe()
os.set_inheritable(ready_write_fd, False)

View File

@ -6,7 +6,7 @@ import os
import pwd
import sys
from contextlib import suppress
from typing import TYPE_CHECKING, Any, Iterator, NamedTuple, Optional, Set
from typing import TYPE_CHECKING, Any, FrozenSet, Iterator, NamedTuple, Optional, Set
from .types import run_once
@ -296,3 +296,9 @@ def local_docs() -> str:
if os.path.isdir(q):
return q
return ''
@run_once
def wrapped_kitten_names() -> FrozenSet[str]:
import kitty.fast_data_types as f
return frozenset(f.wrapped_kitten_names())