mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
common: New function gnupg_usleep.
* configure.ac (HAVE_NANOSLEEP): Test for nanosleep. * common/sysutils.c: Always include time.h. (gnupg_usleep): New. -- This function has been compiled from nPth and Libassuan. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
3b6b8fe32a
commit
ad491ceec6
@ -49,8 +49,8 @@
|
||||
# include <asm/sysinfo.h>
|
||||
# include <asm/unistd.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#ifdef HAVE_SETRLIMIT
|
||||
# include <time.h>
|
||||
# include <sys/time.h>
|
||||
# include <sys/resource.h>
|
||||
#endif
|
||||
@ -307,6 +307,50 @@ gnupg_sleep (unsigned int seconds)
|
||||
}
|
||||
|
||||
|
||||
/* Wrapper around the platforms usleep function. This one won't wake
|
||||
* up before the sleep time has really elapsed. When build with nPth
|
||||
* it merely calls npth_usleep and thus suspends only the current
|
||||
* thread. */
|
||||
void
|
||||
gnupg_usleep (unsigned int usecs)
|
||||
{
|
||||
#if defined(USE_NPTH)
|
||||
|
||||
npth_usleep (usecs);
|
||||
|
||||
#elif defined(HAVE_W32_SYSTEM)
|
||||
|
||||
Sleep ((usecs + 999) / 1000);
|
||||
|
||||
#elif defined(HAVE_NANOSLEEP)
|
||||
|
||||
if (usecs)
|
||||
{
|
||||
struct timespec req;
|
||||
struct timespec rem;
|
||||
|
||||
req.tv_sec = 0;
|
||||
req.tv_nsec = usecs * 1000;
|
||||
|
||||
while (nanosleep (&req, &rem) < 0 && errno == EINTR)
|
||||
req = rem;
|
||||
}
|
||||
|
||||
#else /*Standard Unix*/
|
||||
|
||||
if (usecs)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = usecs / 1000000;
|
||||
tv.tv_usec = usecs % 1000000;
|
||||
select (0, NULL, NULL, NULL, &tv);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* This function is a NOP for POSIX systems but required under Windows
|
||||
as the file handles as returned by OS calls (like CreateFile) are
|
||||
different from the libc file descriptors (like open). This function
|
||||
|
@ -54,6 +54,7 @@ const unsigned char *get_session_marker (size_t *rlen);
|
||||
unsigned int get_uint_nonce (void);
|
||||
/*int check_permissions (const char *path,int extension,int checkonly);*/
|
||||
void gnupg_sleep (unsigned int seconds);
|
||||
void gnupg_usleep (unsigned int usecs);
|
||||
int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
|
||||
int translate_sys2libc_fd_int (int fd, int for_write);
|
||||
FILE *gnupg_tmpfile (void);
|
||||
|
10
configure.ac
10
configure.ac
@ -1387,6 +1387,16 @@ AC_CHECK_FUNCS([memicmp stpcpy strsep strlwr strtoul memmove stricmp strtol \
|
||||
flockfile funlockfile getpwnam getpwuid \
|
||||
getenv inet_pton strpbrk])
|
||||
|
||||
# On some systems (e.g. Solaris) nanosleep requires linking to librl.
|
||||
# Given that we use nanosleep only as an optimization over a select
|
||||
# based wait function we want it only if it is available in libc.
|
||||
_save_libs="$LIBS"
|
||||
AC_SEARCH_LIBS([nanosleep], [],
|
||||
[AC_DEFINE(HAVE_NANOSLEEP,1,
|
||||
[Define to 1 if you have the `nanosleep' function in libc.])])
|
||||
LIBS="$_save_libs"
|
||||
|
||||
|
||||
# See whether libc supports the Linux inotify interface
|
||||
case "${host}" in
|
||||
*-*-linux*)
|
||||
|
Loading…
x
Reference in New Issue
Block a user