Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!swrinde!cs.utexas.edu!uunet!cme!libes From: libes@cme.nist.gov (Don Libes) Newsgroups: comp.unix.wizards Subject: usleep by poll() Message-ID: <999@muffin.cme.nist.gov> Date: 1 Apr 91 22:17:28 GMT References: <2171@estevax.UUCP> <126500@uunet.UU.NET> <6925@auspex.auspex.com> Organization: National Institute of Standards and Technology Lines: 47 I've seen lots of statements to the effect that poll can, cannot, might be able, might not be able, etc to simulate usleep, but I've yet to see code. The FAQ is similarly helpful, showing a BSD implemention (courtesy of Doug Gwyn) but no SV implementation. Here's an implementation of usleep on top of poll that I actually use. Don Libes libes@cme.nist.gov ...!uunet!cme-durer!libes /* subseconds sleeps for System V - or anything that has poll() Don Libes, 4/1/1991 The BSD analog to this function is defined in terms of microseconds while poll() is defined in terms of milliseconds. For compatibility, this function provides accuracy "over the long run" by truncating actual requests to milliseconds and accumulating microseconds across calls with the idea that you are probably calling it in a tight loop, and that over the long run, the error will even out. If you aren't calling it in a tight loop, then you almost certainly aren't making microsecond-resolution requests anyway, in which case you don't care about microseconds. And if you did, you wouldn't be using UNIX anyway because random system indigestion (i.e., scheduling) can make mincemeat out of any timing code. Returns 0 if successful timeout, -1 if unsuccessful. */ #include int usleep(usec) unsigned int usec; /* microseconds */ { static subtotal = 0; /* microseconds */ int msec; /* milliseconds */ subtotal += usec; /* if less then 1 msec request, do nothing but remember it */ if (subtotal < 1000) return(0); msec = subtotal/1000; subtotal = subtotal%1000; return poll((struct pollfd *)0,(unsigned long)0,msec); }