70 lines
1.8 KiB
Bash
70 lines
1.8 KiB
Bash
#!/usr/bin/env zsh
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# WORKER
|
|
# Spaceship wrapper around zsh-async
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Unique array of async jobs
|
|
typeset -ahU SPACESHIP_JOBS=()
|
|
|
|
# Load zsh-async if not loaded yet
|
|
spaceship::worker::load() {
|
|
if ! (( ASYNC_INIT_DONE )); then
|
|
builtin source "$SPACESHIP_ROOT/async.zsh"
|
|
spaceship::precompile "$SPACESHIP_ROOT/async.zsh"
|
|
fi
|
|
}
|
|
|
|
# Lower worker priority to avoid slowing down the prompt
|
|
spaceship::worker::renice() {
|
|
if command -v renice >/dev/null; then
|
|
command renice +15 -p $$
|
|
fi
|
|
|
|
if command -v ionice >/dev/null; then
|
|
command ionice -c 3 -p $$
|
|
fi
|
|
}
|
|
|
|
# This should be called to in callback to update the job counter
|
|
spaceship::worker::callback() {
|
|
SPACESHIP_JOBS=("${(@)SPACESHIP_JOBS:#${1}}")
|
|
}
|
|
|
|
# Start the worker and prepare the environment
|
|
spaceship::worker::init() {
|
|
if spaceship::is_prompt_async; then
|
|
SPACESHIP_JOBS=()
|
|
# restart worker
|
|
async_stop_worker "spaceship"
|
|
async_start_worker "spaceship" -n -u
|
|
# setopt before call register to avoid callback by async_worker_eval
|
|
async_worker_eval "spaceship" setopt extendedglob
|
|
async_worker_eval "spaceship" spaceship::worker::renice
|
|
async_register_callback "spaceship" spaceship::core::async_callback
|
|
fi
|
|
}
|
|
|
|
# Flush jobs for stopped worker
|
|
spaceship::worker::flush() {
|
|
if spaceship::is_prompt_async; then
|
|
async_flush_jobs "spaceship"
|
|
fi
|
|
}
|
|
|
|
# Eval command inside the worker
|
|
spaceship::worker::eval() {
|
|
if spaceship::is_prompt_async; then
|
|
async_worker_eval "spaceship" "$@"
|
|
fi
|
|
}
|
|
|
|
# Run a job in a worker
|
|
spaceship::worker::run() {
|
|
if spaceship::is_prompt_async; then
|
|
SPACESHIP_JOBS+=("$1")
|
|
async_job "spaceship" "$@"
|
|
fi
|
|
}
|