usleep by poll()

Don Libes libes at cme.nist.gov
Tue Apr 2 08:17:28 AEST 1991


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 at 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 <poll.h>

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);
}



More information about the Comp.unix.wizards mailing list