diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-18 22:33:36 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-18 22:33:36 +0000 |
commit | e51c4bc6e493a9cd0d9e9d7f1d24c57ae77bab65 (patch) | |
tree | b2835b396c33c1d9da85a8ecf16430757740593c /sys/src/cmd/sleep.c | |
parent | 5a50a0df165c237503a922a7496c37690c9d4d0b (diff) |
sleep: long sleep
Instead of waking up every second, sleep the maximum
amount possible for long timeouts.
Waking up every second is slow with thousands of
processes hammering the timer.
Diffstat (limited to 'sys/src/cmd/sleep.c')
-rw-r--r-- | sys/src/cmd/sleep.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/src/cmd/sleep.c b/sys/src/cmd/sleep.c index 0a8673bda..56f7b8bd7 100644 --- a/sys/src/cmd/sleep.c +++ b/sys/src/cmd/sleep.c @@ -4,34 +4,39 @@ void main(int argc, char *argv[]) { - long n; + enum { MAXSEC = 0x7fffffff/1000 }; + long n, m; char *p, *q; if(argc>1){ - for(n = strtol(argv[1], &p, 0); n > 0; n--) - sleep(1000); + for(n = strtol(argv[1], &p, 0); n > MAXSEC; n -= MAXSEC) + sleep(MAXSEC*1000); /* * no floating point because it is useful to * be able to run sleep when bootstrapping * a machine. */ - if(*p++ == '.' && (n = strtol(p, &q, 10)) > 0){ + if(*p++ == '.' && (m = strtol(p, &q, 10)) > 0){ switch(q - p){ case 0: break; case 1: - n *= 100; + m *= 100; break; case 2: - n *= 10; + m *= 10; break; default: p[3] = 0; - n = strtol(p, 0, 10); + m = strtol(p, 0, 10); break; } - sleep(n); + } else { + m = 0; } + m += n*1000; + if(m > 0) + sleep(m); } exits(0); } |