From 6259d46d363dd78010e44c905ccf3a3d876c1304 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 25 Aug 2023 14:38:08 -0600 Subject: [PATCH] Move check for MONITOR directly after fork This should properly handle the edge case where the MONITOR option is changed between forking and killing. --- src/async.zsh | 22 ++++++++++------------ zsh-autosuggestions.zsh | 22 ++++++++++------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/async.zsh b/src/async.zsh index e57f63a..d13e35a 100644 --- a/src/async.zsh +++ b/src/async.zsh @@ -16,18 +16,7 @@ _zsh_autosuggest_async_request() { # We won't know the pid unless the user has zsh/system module installed if (( _ZSH_AUTOSUGGEST_CHILD_PID )); then - # Zsh will make a new process group for the child process only if job - # control is enabled (MONITOR option) - if [[ -o MONITOR ]]; then - # Send the signal to the process group to kill any processes that may - # have been forked by the suggestion strategy - kill -TERM -$_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null - else - # Kill just the child process since it wasn't placed in a new process - # group. If the suggestion strategy forked any child processes they may - # be orphaned and left behind. - kill -TERM $_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null - fi + kill -TERM $_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null fi fi @@ -50,6 +39,15 @@ _zsh_autosuggest_async_request() { # Read the pid from the child process read _ZSH_AUTOSUGGEST_CHILD_PID <&$_ZSH_AUTOSUGGEST_ASYNC_FD + # Zsh will make a new process group for the child process only if job + # control is enabled (MONITOR option) + if [[ -o MONITOR ]]; then + # If we need to kill the background process in the future, we'll send + # SIGTERM to the process group to kill any processes that may have been + # forked by the suggestion strategy + _ZSH_AUTOSUGGEST_CHILD_PID=${_ZSH_AUTOSUGGEST_CHILD_PID:+-$_ZSH_AUTOSUGGEST_CHILD_PID} + fi + # When the fd is readable, call the response handler zle -F "$_ZSH_AUTOSUGGEST_ASYNC_FD" _zsh_autosuggest_async_response } diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index d3943c3..b3f2522 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -771,18 +771,7 @@ _zsh_autosuggest_async_request() { # We won't know the pid unless the user has zsh/system module installed if (( _ZSH_AUTOSUGGEST_CHILD_PID )); then - # Zsh will make a new process group for the child process only if job - # control is enabled (MONITOR option) - if [[ -o MONITOR ]]; then - # Send the signal to the process group to kill any processes that may - # have been forked by the suggestion strategy - kill -TERM -$_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null - else - # Kill just the child process since it wasn't placed in a new process - # group. If the suggestion strategy forked any child processes they may - # be orphaned and left behind. - kill -TERM $_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null - fi + kill -TERM $_ZSH_AUTOSUGGEST_CHILD_PID 2>/dev/null fi fi @@ -805,6 +794,15 @@ _zsh_autosuggest_async_request() { # Read the pid from the child process read _ZSH_AUTOSUGGEST_CHILD_PID <&$_ZSH_AUTOSUGGEST_ASYNC_FD + # Zsh will make a new process group for the child process only if job + # control is enabled (MONITOR option) + if [[ -o MONITOR ]]; then + # If we need to kill the background process in the future, we'll send + # SIGTERM to the process group to kill any processes that may have been + # forked by the suggestion strategy + _ZSH_AUTOSUGGEST_CHILD_PID=${_ZSH_AUTOSUGGEST_CHILD_PID:+-$_ZSH_AUTOSUGGEST_CHILD_PID} + fi + # When the fd is readable, call the response handler zle -F "$_ZSH_AUTOSUGGEST_ASYNC_FD" _zsh_autosuggest_async_response }