mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Create a standard function pg_sleep() to sleep for a specified amount of time.
Replace the former ad-hoc implementation used in the regression tests. Joachim Wieland
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.49 2005/10/15 02:49:29 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.50 2006/01/11 20:12:39 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -17,6 +17,7 @@
|
||||
#include <sys/file.h>
|
||||
#include <signal.h>
|
||||
#include <dirent.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "catalog/pg_tablespace.h"
|
||||
#include "catalog/pg_type.h"
|
||||
@ -259,3 +260,51 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
|
||||
FreeDir(fctx->dirdesc);
|
||||
SRF_RETURN_DONE(funcctx);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* pg_sleep - delay for N seconds
|
||||
*/
|
||||
Datum
|
||||
pg_sleep(PG_FUNCTION_ARGS)
|
||||
{
|
||||
float8 secs = PG_GETARG_FLOAT8(0);
|
||||
float8 endtime;
|
||||
|
||||
/*
|
||||
* We break the requested sleep into segments of no more than 1 second,
|
||||
* to put an upper bound on how long it will take us to respond to a
|
||||
* cancel or die interrupt. (Note that pg_usleep is interruptible by
|
||||
* signals on some platforms but not others.) Also, this method avoids
|
||||
* exposing pg_usleep's upper bound on allowed delays.
|
||||
*
|
||||
* By computing the intended stop time initially, we avoid accumulation
|
||||
* of extra delay across multiple sleeps. This also ensures we won't
|
||||
* delay less than the specified time if pg_usleep is interrupted
|
||||
* by other signals such as SIGHUP.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_INT64_TIMESTAMP
|
||||
#define GetNowFloat() ((float8) GetCurrentTimestamp() / 1000000.0)
|
||||
#else
|
||||
#define GetNowFloat() GetCurrentTimestamp()
|
||||
#endif
|
||||
|
||||
endtime = GetNowFloat() + secs;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
float8 delay;
|
||||
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
delay = endtime - GetNowFloat();
|
||||
if (delay >= 1.0)
|
||||
pg_usleep(1000000L);
|
||||
else if (delay > 0.0)
|
||||
pg_usleep((long) ceil(delay * 1000000.0));
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
Reference in New Issue
Block a user