From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/OR_USING_C/nap.c | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 reference/C/CONTRIB/OR_USING_C/nap.c (limited to 'reference/C/CONTRIB/OR_USING_C/nap.c') diff --git a/reference/C/CONTRIB/OR_USING_C/nap.c b/reference/C/CONTRIB/OR_USING_C/nap.c new file mode 100644 index 0000000..09f4a74 --- /dev/null +++ b/reference/C/CONTRIB/OR_USING_C/nap.c @@ -0,0 +1,63 @@ +#include +#include + +#define setvec(vec, a) \ + vec.sv_handler = a; \ + vec.sv_mask = vec.sv_flags = 0 + +static int ringring; + +nap(n) +unsigned n; +{ + void napx(); + int omask; + struct sigvec vec, ovec; + struct itimerval itv, oitv; + register struct itimerval *itp = &itv; + + if (n == 0) + return; + timerclear(&itp->it_interval); + timerclear(&itp->it_value); + if (setitimer(ITIMER_REAL, itp, &oitv) < 0) + return; + setvec(ovec, SIG_DFL); + omask = sigblock(sigmask(SIGALRM)); + itp->it_value.tv_sec = n/60; + itp->it_value.tv_usec = (n%60)*1000000/60; + if (timerisset(&oitv.it_value)) { + if (oitv.it_value.tv_sec >= itp->it_value.tv_sec) { + if (oitv.it_value.tv_sec == itp->it_value.tv_sec && + oitv.it_value.tv_usec > itp->it_value.tv_usec) + oitv.it_value.tv_usec -= itp->it_value.tv_usec; + oitv.it_value.tv_sec -= itp->it_value.tv_sec; + } + else { + itp->it_value = oitv.it_value; + /* + * This is a hack, but we must have time to return from + * the setitimer after the alarm or else it will restart. + * And, anyway, sleep never did more than this before. + */ + oitv.it_value.tv_sec = 1; + oitv.it_value.tv_usec = 0; + } + } + setvec(vec, napx); + ringring = 0; + sigvec(SIGALRM, &vec, &ovec); + setitimer(ITIMER_REAL, itp, (struct itimerval *)0); + while (!ringring) + sigpause(omask &~ sigmask(SIGALRM)); + sigvec(SIGALRM, &ovec, (struct sigvec *)0); + setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); + sigsetmask(omask); +} + +static void +napx() +{ + ringring = 1; +} + -- cgit v1.2.3-54-g00ecf