fix(async): avoid blocking the shell while waiting (#12304)

Co-authored-by: Marc Cornellà <marc@mcornella.com>
This commit is contained in:
Loïc Yhuel 2024-04-03 19:42:47 +02:00 committed by GitHub
parent 130002a79e
commit b43b84abc7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -82,10 +82,8 @@ function _omz_async_request {
exec {fd}< <( exec {fd}< <(
# Tell parent process our PID # Tell parent process our PID
builtin echo ${sysparams[pid]} builtin echo ${sysparams[pid]}
# Store handler name for callback
builtin echo $handler
# Set exit code for the handler if used # Set exit code for the handler if used
(exit $ret) () { return $ret }
# Run the async function handler # Run the async function handler
$handler $handler
) )
@ -98,8 +96,7 @@ function _omz_async_request {
command true command true
# Save the PID from the handler child process # Save the PID from the handler child process
read pid <&$fd read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
_OMZ_ASYNC_PIDS[$handler]=$pid
# When the fd is readable, call the response handler # When the fd is readable, call the response handler
zle -F "$fd" _omz_async_callback zle -F "$fd" _omz_async_callback
@ -114,15 +111,14 @@ function _omz_async_callback() {
local err=$2 # Second arg will be passed in case of error local err=$2 # Second arg will be passed in case of error
if [[ -z "$err" || "$err" == "hup" ]]; then if [[ -z "$err" || "$err" == "hup" ]]; then
# Get handler name from first line # Get handler name from fd
local handler local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
read handler <&$fd
# Store old output which is supposed to be already printed # Store old output which is supposed to be already printed
local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}" local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
# Read output from fd # Read output from fd
_OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)" IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]"
# Repaint prompt if output has changed # Repaint prompt if output has changed
if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then