ref: e51c4bc6e493a9cd0d9e9d7f1d24c57ae77bab65
parent: 5a50a0df165c237503a922a7496c37690c9d4d0b
author: cinap_lenrek <[email protected]>
date: Sun Dec 18 17:33:36 EST 2022
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.
--- 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);
}