Browse Source

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

Co-authored-by: Marc Cornellà <marc@mcornella.com>
Loïc Yhuel 4 weeks ago
parent
commit
b43b84abc7
1 changed files with 5 additions and 9 deletions
  1. 5 9
      lib/async_prompt.zsh

+ 5 - 9
lib/async_prompt.zsh

@@ -82,10 +82,8 @@ function _omz_async_request {
     exec {fd}< <(
       # Tell parent process our PID
       builtin echo ${sysparams[pid]}
-      # Store handler name for callback
-      builtin echo $handler
       # Set exit code for the handler if used
-      (exit $ret)
+      () { return $ret }
       # Run the async function handler
       $handler
     )
@@ -98,8 +96,7 @@ function _omz_async_request {
     command true
 
     # Save the PID from the handler child process
-    read pid <&$fd
-    _OMZ_ASYNC_PIDS[$handler]=$pid
+    read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
 
     # When the fd is readable, call the response handler
     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
 
   if [[ -z "$err" || "$err" == "hup" ]]; then
-    # Get handler name from first line
-    local handler
-    read handler <&$fd
+    # Get handler name from fd
+    local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
 
     # Store old output which is supposed to be already printed
     local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
 
     # 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
     if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then