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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Narvin Singh
						Narvin Singh