1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-03 01:21:48 +03:00
postgres/src/port/pgsleep.c
Alvaro Herrera 1f55a050d5 Include <sys/select.h> where needed
<sys/select.h> is required by POSIX.1-2001 to get the prototype of
select(2), but nearly no systems enforce that because older standards
let you get away with including some other headers.  Recent OpenBSD
hacking has removed that frail touch of friendliness, however, which
broke some compiles; fix all the way back to 9.1 by adding the required
standard.  Only vacuumdb.c was reported to fail, but it seems easier to
fix the whole lot in a fell swoop.

Per bug #14334 by Sean Farrell.
2016-09-27 01:05:21 -03:00

54 lines
1.3 KiB
C

/*-------------------------------------------------------------------------
*
* pgsleep.c
* Portable delay handling.
*
*
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
*
* src/port/pgsleep.c
*
*-------------------------------------------------------------------------
*/
#include "c.h"
#include <unistd.h>
#include <sys/time.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
/*
* In a Windows backend, we don't use this implementation, but rather
* the signal-aware version in src/backend/port/win32/signal.c.
*/
#if defined(FRONTEND) || !defined(WIN32)
/*
* pg_usleep --- delay the specified number of microseconds.
*
* NOTE: although the delay is specified in microseconds, the effective
* resolution is only 1/HZ, or 10 milliseconds, on most Unixen. Expect
* the requested delay to be rounded up to the next resolution boundary.
*
* On machines where "long" is 32 bits, the maximum delay is ~2000 seconds.
*/
void
pg_usleep(long microsec)
{
if (microsec > 0)
{
#ifndef WIN32
struct timeval delay;
delay.tv_sec = microsec / 1000000L;
delay.tv_usec = microsec % 1000000L;
(void) select(0, NULL, NULL, NULL, &delay);
#else
SleepEx((microsec < 500 ? 1 : (microsec + 500) / 1000), FALSE);
#endif
}
}
#endif /* defined(FRONTEND) || !defined(WIN32) */