|
|
1.1 ! root 1: /* nap.c Larn is copyrighted 1986 by Noah Morgan. */ ! 2: #include <signal.h> ! 3: #include <sys/types.h> ! 4: #ifdef SYSV ! 5: #include <sys/times.h> ! 6: #else ! 7: #ifdef BSD ! 8: #include <sys/timeb.h> ! 9: #endif BSD ! 10: #endif SYSV ! 11: ! 12: /* ! 13: * routine to take a nap for n milliseconds ! 14: */ ! 15: nap(x) ! 16: register int x; ! 17: { ! 18: if (x<=0) return; /* eliminate chance for infinite loop */ ! 19: lflush(); ! 20: if (x > 999) sleep(x/1000); else napms(x); ! 21: } ! 22: ! 23: #ifdef NONAP ! 24: napms(x) /* do nothing */ ! 25: int x; ! 26: { ! 27: } ! 28: #else NONAP ! 29: #ifdef SYSV ! 30: /* napms - sleep for time milliseconds - uses times() */ ! 31: /* this assumes that times returns a relative time in 60ths of a second */ ! 32: /* this will do horrible things if your times() returns seconds! */ ! 33: napms(time) ! 34: int time; ! 35: { ! 36: long matchclock, times(); ! 37: struct tms stats; ! 38: ! 39: if (time<=0) time=1; /* eliminate chance for infinite loop */ ! 40: if ((matchclock = times(&stats)) == -1 || matchclock == 0) ! 41: return; /* error, or BSD style times() */ ! 42: matchclock += (time / 17); /*17 ms/tic is 1000 ms/sec / 60 tics/sec */ ! 43: ! 44: while(matchclock < times(&stats)) ! 45: ; ! 46: } ! 47: ! 48: #else not SYSV ! 49: #ifdef BSD ! 50: #ifdef SIGVTALRM ! 51: /* This must be BSD 4.2! */ ! 52: #include <sys/time.h> ! 53: #define bit(_a) (1<<((_a)-1)) ! 54: ! 55: static nullf() ! 56: { ! 57: } ! 58: ! 59: /* napms - sleep for time milliseconds - uses setitimer() */ ! 60: napms(time) ! 61: int time; ! 62: { ! 63: struct itimerval timeout; ! 64: int (*oldhandler) (); ! 65: int oldsig; ! 66: ! 67: if (time <= 0) return; ! 68: ! 69: timerclear(&timeout.it_interval); ! 70: timeout.it_value.tv_sec = time / 1000; ! 71: timeout.it_value.tv_usec = (time % 1000) * 1000; ! 72: ! 73: oldsig = sigblock(bit(SIGALRM)); ! 74: setitimer(ITIMER_REAL, &timeout, (struct itimerval *)0); ! 75: oldhandler = signal(SIGALRM, nullf); ! 76: sigpause(oldsig); ! 77: signal(SIGALRM, oldhandler); ! 78: sigsetmask(oldsig); ! 79: } ! 80: ! 81: #else ! 82: /* napms - sleep for time milliseconds - uses ftime() */ ! 83: ! 84: static napms(time) ! 85: int time; ! 86: { ! 87: /* assumed to be BSD UNIX */ ! 88: struct timeb _gtime; ! 89: time_t matchtime; ! 90: unsigned short matchmilli; ! 91: register struct timeb *tp = & _gtime; ! 92: ! 93: if (time <= 0) return; ! 94: ftime(tp); ! 95: matchmilli = tp->millitm + time; ! 96: matchtime = tp->time; ! 97: while (matchmilli >= 1000) ! 98: { ! 99: ++matchtime; ! 100: matchmilli -= 1000; ! 101: } ! 102: ! 103: while(1) ! 104: { ! 105: ftime(tp); ! 106: if ((tp->time > matchtime) || ! 107: ((tp->time == matchtime) && (tp->millitm >= matchmilli))) ! 108: break; ! 109: } ! 110: } ! 111: #endif ! 112: #else not BSD ! 113: static napms(time) int time; {} /* do nothing, forget it */ ! 114: #endif BSD ! 115: #endif SYSV ! 116: #endif NONAP
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.