Feat: Efficient waiting with long-running sleep
Replace short foreground sleep in a loop with a long background sleep in a loop that we wait, which should be much more efficient.
This commit is contained in:
parent
ea4806df9d
commit
96442be9b3
29
xrsbd
29
xrsbd
@ -5,18 +5,16 @@
|
|||||||
main() {
|
main() {
|
||||||
# Customizable configuration constants
|
# Customizable configuration constants
|
||||||
local -r DEFAULT_MOD_LIST='cpu mem bl vol-amixer bat dt'
|
local -r DEFAULT_MOD_LIST='cpu mem bl vol-amixer bat dt'
|
||||||
local -r DEFAULT_RES=.25
|
|
||||||
local -r DEFAULT_PRE=' '
|
local -r DEFAULT_PRE=' '
|
||||||
local -r DEFAULT_SEP_L='| '
|
local -r DEFAULT_SEP_L='| '
|
||||||
local -r DEFAULT_SEP_R=' '
|
local -r DEFAULT_SEP_R=' '
|
||||||
local -r DEFAULT_SUF=' '
|
local -r DEFAULT_SUF=' '
|
||||||
|
|
||||||
local -r mod_list="${1-${DEFAULT_MOD_LIST}}"
|
local -r mod_list="${1-${DEFAULT_MOD_LIST}}"
|
||||||
local -r res="${2:-${DEFAULT_RES}}"
|
local -r pre="${2-${DEFAULT_PRE}}"
|
||||||
local -r pre="${3-${DEFAULT_PRE}}"
|
local -r sep_l="${3-${DEFAULT_SEP_L}}"
|
||||||
local -r sep_l="${4-${DEFAULT_SEP_L}}"
|
local -r sep_r="${4-${DEFAULT_SEP_R}}"
|
||||||
local -r sep_r="${5-${DEFAULT_SEP_R}}"
|
local -r suf="${5-${DEFAULT_SUF}}"
|
||||||
local -r suf="${6-${DEFAULT_SUF}}"
|
|
||||||
|
|
||||||
local -r MOD_DIR="$(dirname "$0")"/module
|
local -r MOD_DIR="$(dirname "$0")"/module
|
||||||
local -r ACTION_DIR=/tmp/xrsb-action
|
local -r ACTION_DIR=/tmp/xrsb-action
|
||||||
@ -84,12 +82,27 @@ main() {
|
|||||||
if [[ -v is_changed ]]; then draw_status; fi
|
if [[ -v is_changed ]]; then draw_status; fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Wait for signals
|
# Begin trapping signals
|
||||||
mkdir -p "${ACTION_DIR}"
|
mkdir -p "${ACTION_DIR}"
|
||||||
trap process_signal SIGUSR1
|
trap process_signal SIGUSR1
|
||||||
|
|
||||||
|
# Wait for signals efficiently. In a loop begin a long-running sleep command
|
||||||
|
# in the background, then wait on it. If we trap a signal before the wait
|
||||||
|
# is over and sleep is still running, trap will call process_signal, then
|
||||||
|
# code execution will resume at the line after the wait statement. So on
|
||||||
|
# that line we kill the (probably) still running sleep command so they
|
||||||
|
# don't pile up, and loop to sleep and wait for the next signal. If we
|
||||||
|
# don't trap a signal during the long running sleep, then the wait ends,
|
||||||
|
# we try to kill the sleep command that has already exited, so it doesn't
|
||||||
|
# matter, and loop to sleep and wait again. Note that we don't make the
|
||||||
|
# sleep too long because if the daemon is killed, the sleep will become
|
||||||
|
# an orphaned process until the sleep period elapses.
|
||||||
|
local -i sleep_pid
|
||||||
while :; do
|
while :; do
|
||||||
sleep "${res}"
|
sleep 30m &
|
||||||
|
sleep_pid="$!"
|
||||||
|
wait "${sleep_pid}"
|
||||||
|
kill "${sleep_pid}" 2>/dev/null
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user