mirror of
https://github.com/moparisthebest/curl
synced 2025-03-11 07:39:50 -04:00
Internal time differences now use monotonic time source if available.
This also implies the removal of the winmm.lib dependency for WIN32.
This commit is contained in:
parent
d708ef6731
commit
19479ea021
4
CHANGES
4
CHANGES
@ -7,6 +7,10 @@
|
|||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
|
||||||
|
Yang Tse (9 May 2008)
|
||||||
|
- Internal time differences now use monotonic time source if available.
|
||||||
|
This also implies the removal of the winmm.lib dependency for WIN32.
|
||||||
|
|
||||||
Daniel Stenberg (9 May 2008)
|
Daniel Stenberg (9 May 2008)
|
||||||
- Stefan Krause reported a busy-looping case when using the multi interface
|
- Stefan Krause reported a busy-looping case when using the multi interface
|
||||||
and doing CONNECT to a proxy. The app would then busy-loop until the proxy
|
and doing CONNECT to a proxy. The app would then busy-loop until the proxy
|
||||||
|
@ -33,6 +33,7 @@ This release includes the following bugfixes:
|
|||||||
o microsecond resolution keys for internal splay trees
|
o microsecond resolution keys for internal splay trees
|
||||||
o krb4 and krb5 ftp segfault
|
o krb4 and krb5 ftp segfault
|
||||||
o multi interface busy loop for CONNECT requests
|
o multi interface busy loop for CONNECT requests
|
||||||
|
o internal time differences now use monotonic time source if available
|
||||||
|
|
||||||
This release includes the following known bugs:
|
This release includes the following known bugs:
|
||||||
|
|
||||||
|
31
configure.ac
31
configure.ac
@ -674,36 +674,6 @@ if test x$CURL_DISABLE_LDAP != x1 ; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
|
||||||
dnl Check for the presence of the winmm library.
|
|
||||||
dnl **********************************************************************
|
|
||||||
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin*)
|
|
||||||
dnl Under Cygwin, winmm exists but is not needed as WIN32 is not #defined
|
|
||||||
dnl and gettimeofday() will be used regardless of the outcome of this test.
|
|
||||||
dnl Skip this test, otherwise -lwinmm will be needlessly added to LIBS
|
|
||||||
dnl (and recorded as such in the .la file, potentially affecting downstream
|
|
||||||
dnl clients of the library.)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_CHECKING([for timeGetTime in winmm])
|
|
||||||
my_ac_save_LIBS=$LIBS
|
|
||||||
LIBS="-lwinmm $LIBS"
|
|
||||||
AC_TRY_LINK([#include <windef.h>
|
|
||||||
#include <mmsystem.h>
|
|
||||||
],
|
|
||||||
[timeGetTime();],
|
|
||||||
[ dnl worked!
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
],
|
|
||||||
[ dnl failed, restore LIBS
|
|
||||||
LIBS=$my_ac_save_LIBS
|
|
||||||
AC_MSG_RESULT(no)]
|
|
||||||
)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Checks for IPv6
|
dnl Checks for IPv6
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@ -2006,6 +1976,7 @@ AC_CHECK_FUNCS( strtoll \
|
|||||||
strcmpi \
|
strcmpi \
|
||||||
gethostbyaddr \
|
gethostbyaddr \
|
||||||
gettimeofday \
|
gettimeofday \
|
||||||
|
clock_gettime \
|
||||||
inet_addr \
|
inet_addr \
|
||||||
inet_ntoa \
|
inet_ntoa \
|
||||||
inet_pton \
|
inet_pton \
|
||||||
|
@ -239,7 +239,7 @@ Linker Links
|
|||||||
checked.
|
checked.
|
||||||
|
|
||||||
3- Include in the white space immediately below the box referred in 2 -lcurl
|
3- Include in the white space immediately below the box referred in 2 -lcurl
|
||||||
-lws2_32 -lwinmm.
|
-lws2_32.
|
||||||
|
|
||||||
SSL Files
|
SSL Files
|
||||||
---------
|
---------
|
||||||
|
@ -106,7 +106,7 @@ ifndef USE_LDAP_OPENLDAP
|
|||||||
curl_LDADD += -lwldap32
|
curl_LDADD += -lwldap32
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
curl_LDADD += -lws2_32 -lwinmm
|
curl_LDADD += -lws2_32
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
|
|
||||||
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
|
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
|
||||||
|
@ -10,7 +10,7 @@ CC = wcc386
|
|||||||
|
|
||||||
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt &
|
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt &
|
||||||
-bd -d+ -dWIN32 -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") &
|
-bd -d+ -dWIN32 -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") &
|
||||||
-dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6 &
|
-dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -dENABLE_IPV6 &
|
||||||
-dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -d_WIN32_WINNT=0x0501 &
|
-dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -d_WIN32_WINNT=0x0501 &
|
||||||
-dWINBERAPI=__declspec(cdecl) -dWINLDAPAPI=__declspec(cdecl) &
|
-dWINBERAPI=__declspec(cdecl) -dWINLDAPAPI=__declspec(cdecl) &
|
||||||
-I. -I..\include
|
-I. -I..\include
|
||||||
|
@ -96,7 +96,7 @@ ifndef USE_LDAP_OPENLDAP
|
|||||||
DLL_LIBS += -lwldap32
|
DLL_LIBS += -lwldap32
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
DLL_LIBS += -lws2_32 -lwinmm
|
DLL_LIBS += -lws2_32
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
|
@ -66,10 +66,6 @@ WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
|
|||||||
!ENDIF
|
!ENDIF
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
# Use the high resolution time by default. Comment this out to use low
|
|
||||||
# resolution time and not require winmm.lib
|
|
||||||
USEMM_LIBS = YES
|
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
|
|
||||||
@ -85,13 +81,9 @@ LFLAGS = /nologo /machine:$(MACHINE)
|
|||||||
SSLLIBS = libeay32.lib ssleay32.lib
|
SSLLIBS = libeay32.lib ssleay32.lib
|
||||||
ZLIBLIBSDLL= zdll.lib
|
ZLIBLIBSDLL= zdll.lib
|
||||||
ZLIBLIBS = zlib.lib
|
ZLIBLIBS = zlib.lib
|
||||||
!IFDEF USEMM_LIBS
|
|
||||||
WINLIBS = wsock32.lib wldap32.lib winmm.lib
|
|
||||||
!ELSE
|
|
||||||
WINLIBS = wsock32.lib wldap32.lib
|
WINLIBS = wsock32.lib wldap32.lib
|
||||||
CFLAGS = $(CFLAGS) /DWITHOUT_MM_LIB
|
CFLAGS = $(CFLAGS)
|
||||||
!ENDIF
|
|
||||||
# RSAglue.lib was formerly needed in the SSLLIBS
|
|
||||||
CFGSET = FALSE
|
CFGSET = FALSE
|
||||||
|
|
||||||
!IFDEF WINDOWS_SSPI
|
!IFDEF WINDOWS_SSPI
|
||||||
|
@ -350,7 +350,6 @@
|
|||||||
#define CURL_DISABLE_FILE 1
|
#define CURL_DISABLE_FILE 1
|
||||||
#define CURL_DISABLE_TELNET 1
|
#define CURL_DISABLE_TELNET 1
|
||||||
#define CURL_DISABLE_LDAP 1
|
#define CURL_DISABLE_LDAP 1
|
||||||
#define WITHOUT_MM_LIB 1
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
#ifdef HAVE_WINDOWS_H
|
||||||
# ifndef WIN32_LEAN_AND_MEAN
|
# ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
@ -54,7 +54,7 @@ BSC32=bscmake.exe
|
|||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||||
# ADD LINK32 kernel32.lib ws2_32.lib wldap32.lib winmm.lib /nologo /dll /map /debug /machine:I386 /out:"Release/libcurl.dll"
|
# ADD LINK32 kernel32.lib ws2_32.lib wldap32.lib /nologo /dll /map /debug /machine:I386 /out:"Release/libcurl.dll"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "curllib - Win32 Debug"
|
!ELSEIF "$(CFG)" == "curllib - Win32 Debug"
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ BSC32=bscmake.exe
|
|||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
# ADD LINK32 kernel32.lib ws2_32.lib wldap32.lib winmm.lib /nologo /dll /incremental:no /map /debug /machine:I386 /out:"Debug/libcurl.dll" /pdbtype:sept
|
# ADD LINK32 kernel32.lib ws2_32.lib wldap32.lib /nologo /dll /incremental:no /map /debug /machine:I386 /out:"Debug/libcurl.dll" /pdbtype:sept
|
||||||
# SUBTRACT LINK32 /nodefaultlib
|
# SUBTRACT LINK32 /nodefaultlib
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
@ -184,7 +184,7 @@ int Curl_socket_ready(curl_socket_t readfd, curl_socket_t writefd,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Avoid initial timestamp, avoid gettimeofday() call, when elapsed
|
/* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed
|
||||||
time in this function does not need to be measured. This happens
|
time in this function does not need to be measured. This happens
|
||||||
when function is called with a zero timeout or a negative timeout
|
when function is called with a zero timeout or a negative timeout
|
||||||
value indicating a blocking call should be performed. */
|
value indicating a blocking call should be performed. */
|
||||||
@ -368,7 +368,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Avoid initial timestamp, avoid gettimeofday() call, when elapsed
|
/* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed
|
||||||
time in this function does not need to be measured. This happens
|
time in this function does not need to be measured. This happens
|
||||||
when function is called with a zero timeout or a negative timeout
|
when function is called with a zero timeout or a negative timeout
|
||||||
value indicating a blocking call should be performed. */
|
value indicating a blocking call should be performed. */
|
||||||
|
113
lib/timeval.c
113
lib/timeval.c
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -23,69 +23,70 @@
|
|||||||
|
|
||||||
#include "timeval.h"
|
#include "timeval.h"
|
||||||
|
|
||||||
#ifndef HAVE_GETTIMEOFDAY
|
#if defined(WIN32) && !defined(MSDOS)
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <mmsystem.h>
|
|
||||||
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
#ifdef WITHOUT_MM_LIB
|
|
||||||
SYSTEMTIME st;
|
|
||||||
time_t tt;
|
|
||||||
struct tm tmtm;
|
|
||||||
/* mktime converts local to UTC */
|
|
||||||
GetLocalTime (&st);
|
|
||||||
tmtm.tm_sec = st.wSecond;
|
|
||||||
tmtm.tm_min = st.wMinute;
|
|
||||||
tmtm.tm_hour = st.wHour;
|
|
||||||
tmtm.tm_mday = st.wDay;
|
|
||||||
tmtm.tm_mon = st.wMonth - 1;
|
|
||||||
tmtm.tm_year = st.wYear - 1900;
|
|
||||||
tmtm.tm_isdst = -1;
|
|
||||||
tt = mktime (&tmtm);
|
|
||||||
tp->tv_sec = tt;
|
|
||||||
tp->tv_usec = st.wMilliseconds * 1000;
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
** The earlier time calculations using GetLocalTime
|
|
||||||
** had a time resolution of 10ms.The timeGetTime, part
|
|
||||||
** of multimedia apis offer a better time resolution
|
|
||||||
** of 1ms.Need to link against winmm.lib for this
|
|
||||||
**/
|
|
||||||
unsigned long Ticks = 0;
|
|
||||||
unsigned long Sec =0;
|
|
||||||
unsigned long Usec = 0;
|
|
||||||
Ticks = timeGetTime();
|
|
||||||
|
|
||||||
Sec = Ticks/1000;
|
|
||||||
Usec = (Ticks - (Sec*1000))*1000;
|
|
||||||
tp->tv_sec = Sec;
|
|
||||||
tp->tv_usec = Usec;
|
|
||||||
#endif /* WITHOUT_MM_LIB */
|
|
||||||
(void)nothing;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else /* WIN32 */
|
|
||||||
/* non-win32 version of Curl_gettimeofday() */
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
(void)nothing; /* we don't support specific time-zones */
|
|
||||||
tp->tv_sec = (long)time(NULL);
|
|
||||||
tp->tv_usec = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* WIN32 */
|
|
||||||
#endif /* HAVE_GETTIMEOFDAY */
|
|
||||||
|
|
||||||
/* Return the current time in a timeval struct */
|
|
||||||
struct timeval curlx_tvnow(void)
|
struct timeval curlx_tvnow(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
** GetTickCount() is available on _all_ Windows versions from W95 up
|
||||||
|
** to nowadays. Returns milliseconds elapsed since last system boot,
|
||||||
|
** increases monotonically and wraps once 49.7 days have elapsed.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
DWORD milliseconds = GetTickCount();
|
||||||
|
now.tv_sec = milliseconds / 1000;
|
||||||
|
now.tv_usec = (milliseconds % 1000) * 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
||||||
|
|
||||||
|
struct timeval curlx_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** clock_gettime() is granted to be increased monotonically when the
|
||||||
|
** monotonic clock is queried. Time starting point is unspecified, it
|
||||||
|
** could be the system start-up time, the Epoch, or something else,
|
||||||
|
** in any case the time starting point does not change once that the
|
||||||
|
** system has started up.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
struct timespec tsnow;
|
||||||
|
(void)clock_gettime(CLOCK_MONOTONIC, &tsnow)
|
||||||
|
now.tv_sec = tsnow.tv_sec;
|
||||||
|
now.tv_usec = tsnow.tv_nsec / 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_GETTIMEOFDAY)
|
||||||
|
|
||||||
|
struct timeval curlx_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** gettimeofday() is not granted to be increased monotonically, due to
|
||||||
|
** clock drifting and external source time synchronization it can jump
|
||||||
|
** forward or backward in time.
|
||||||
|
*/
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
(void)gettimeofday(&now, NULL);
|
(void)gettimeofday(&now, NULL);
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
struct timeval curlx_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** time() returns the value of time in seconds since the Epoch.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
now.tv_sec = (long)time(NULL);
|
||||||
|
now.tv_usec = 0;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure that the first argument is the more recent time, as otherwise
|
* Make sure that the first argument is the more recent time, as otherwise
|
||||||
* we'll get a weird negative time-diff back...
|
* we'll get a weird negative time-diff back...
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
CC = wcc386
|
CC = wcc386
|
||||||
|
|
||||||
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm &
|
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm &
|
||||||
-bt=nt -d+ -dWIN32 -dHAVE_STRTOLL -dWITHOUT_MM_LIB &
|
-bt=nt -d+ -dWIN32 -dHAVE_STRTOLL &
|
||||||
-dSIZEOF_CURL_OFF_T=8 -dCURLDEBUG -dENABLE_IPV6 -dHAVE_WINSOCK2_H &
|
-dSIZEOF_CURL_OFF_T=8 -dCURLDEBUG -dENABLE_IPV6 -dHAVE_WINSOCK2_H &
|
||||||
-I..\include -I..\lib
|
-I..\include -I..\lib
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ ifndef USE_LDAP_OPENLDAP
|
|||||||
curl_LDADD += -lwldap32
|
curl_LDADD += -lwldap32
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
curl_LDADD += -lws2_32 -lwinmm
|
curl_LDADD += -lws2_32
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
## Comments to: Troy Engel <tengel@sonic.net>
|
## Comments to: Troy Engel <tengel@sonic.net>
|
||||||
## Updated by: Craig Davison <cd@securityfocus.com>
|
## Updated by: Craig Davison <cd@securityfocus.com>
|
||||||
## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
|
## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
|
||||||
## winmm.lib added by Miklos Nemeth <mnemeth@kfkisystems.com> to
|
|
||||||
## support timeGetTime() in curlutil.c
|
|
||||||
#
|
#
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
@ -221,8 +219,8 @@ LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
|
|||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
|
||||||
LINKLIBS = $(LINKLIBS) wsock32.lib wldap32.lib winmm.lib
|
LINKLIBS = $(LINKLIBS) wsock32.lib wldap32.lib
|
||||||
LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) wsock32.lib wldap32.lib winmm.lib
|
LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) wsock32.lib wldap32.lib
|
||||||
|
|
||||||
all : release
|
all : release
|
||||||
|
|
||||||
|
113
src/curlutil.c
113
src/curlutil.c
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -25,69 +25,70 @@
|
|||||||
|
|
||||||
#include "curlutil.h"
|
#include "curlutil.h"
|
||||||
|
|
||||||
#ifndef HAVE_GETTIMEOFDAY
|
#if defined(WIN32) && !defined(MSDOS)
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <mmsystem.h>
|
|
||||||
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
#ifdef WITHOUT_MM_LIB
|
|
||||||
SYSTEMTIME st;
|
|
||||||
time_t tt;
|
|
||||||
struct tm tmtm;
|
|
||||||
/* mktime converts local to UTC */
|
|
||||||
GetLocalTime (&st);
|
|
||||||
tmtm.tm_sec = st.wSecond;
|
|
||||||
tmtm.tm_min = st.wMinute;
|
|
||||||
tmtm.tm_hour = st.wHour;
|
|
||||||
tmtm.tm_mday = st.wDay;
|
|
||||||
tmtm.tm_mon = st.wMonth - 1;
|
|
||||||
tmtm.tm_year = st.wYear - 1900;
|
|
||||||
tmtm.tm_isdst = -1;
|
|
||||||
tt = mktime (&tmtm);
|
|
||||||
tp->tv_sec = tt;
|
|
||||||
tp->tv_usec = st.wMilliseconds * 1000;
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
** The earlier time calculations using GetLocalTime
|
|
||||||
** had a time resolution of 10ms.The timeGetTime, part
|
|
||||||
** of multimedia apis offer a better time resolution
|
|
||||||
** of 1ms.Need to link against winmm.lib for this
|
|
||||||
**/
|
|
||||||
unsigned long Ticks = 0;
|
|
||||||
unsigned long Sec =0;
|
|
||||||
unsigned long Usec = 0;
|
|
||||||
Ticks = timeGetTime();
|
|
||||||
|
|
||||||
Sec = Ticks/1000;
|
|
||||||
Usec = (Ticks - (Sec*1000))*1000;
|
|
||||||
tp->tv_sec = Sec;
|
|
||||||
tp->tv_usec = Usec;
|
|
||||||
#endif /* WITHOUT_MM_LIB */
|
|
||||||
(void)nothing;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else /* WIN32 */
|
|
||||||
/* non-win32 version of Curl_gettimeofday() */
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
(void)nothing; /* we don't support specific time-zones */
|
|
||||||
tp->tv_sec = (long)time(NULL);
|
|
||||||
tp->tv_usec = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* WIN32 */
|
|
||||||
#endif /* HAVE_GETTIMEOFDAY */
|
|
||||||
|
|
||||||
/* Return the current time in a timeval struct */
|
|
||||||
struct timeval cutil_tvnow(void)
|
struct timeval cutil_tvnow(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
** GetTickCount() is available on _all_ Windows versions from W95 up
|
||||||
|
** to nowadays. Returns milliseconds elapsed since last system boot,
|
||||||
|
** increases monotonically and wraps once 49.7 days have elapsed.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
DWORD milliseconds = GetTickCount();
|
||||||
|
now.tv_sec = milliseconds / 1000;
|
||||||
|
now.tv_usec = (milliseconds % 1000) * 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
||||||
|
|
||||||
|
struct timeval cutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** clock_gettime() is granted to be increased monotonically when the
|
||||||
|
** monotonic clock is queried. Time starting point is unspecified, it
|
||||||
|
** could be the system start-up time, the Epoch, or something else,
|
||||||
|
** in any case the time starting point does not change once that the
|
||||||
|
** system has started up.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
struct timespec tsnow;
|
||||||
|
(void)clock_gettime(CLOCK_MONOTONIC, &tsnow)
|
||||||
|
now.tv_sec = tsnow.tv_sec;
|
||||||
|
now.tv_usec = tsnow.tv_nsec / 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_GETTIMEOFDAY)
|
||||||
|
|
||||||
|
struct timeval cutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** gettimeofday() is not granted to be increased monotonically, due to
|
||||||
|
** clock drifting and external source time synchronization it can jump
|
||||||
|
** forward or backward in time.
|
||||||
|
*/
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
(void)gettimeofday(&now, NULL);
|
(void)gettimeofday(&now, NULL);
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
struct timeval cutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** time() returns the value of time in seconds since the Epoch.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
now.tv_sec = (long)time(NULL);
|
||||||
|
now.tv_usec = 0;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure that the first argument is the more recent time, as otherwise
|
* Make sure that the first argument is the more recent time, as otherwise
|
||||||
* we'll get a weird negative time-diff back...
|
* we'll get a weird negative time-diff back...
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -25,69 +25,70 @@
|
|||||||
|
|
||||||
#include "testutil.h"
|
#include "testutil.h"
|
||||||
|
|
||||||
#ifndef HAVE_GETTIMEOFDAY
|
#if defined(WIN32) && !defined(MSDOS)
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <mmsystem.h>
|
|
||||||
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
#ifdef WITHOUT_MM_LIB
|
|
||||||
SYSTEMTIME st;
|
|
||||||
time_t tt;
|
|
||||||
struct tm tmtm;
|
|
||||||
/* mktime converts local to UTC */
|
|
||||||
GetLocalTime (&st);
|
|
||||||
tmtm.tm_sec = st.wSecond;
|
|
||||||
tmtm.tm_min = st.wMinute;
|
|
||||||
tmtm.tm_hour = st.wHour;
|
|
||||||
tmtm.tm_mday = st.wDay;
|
|
||||||
tmtm.tm_mon = st.wMonth - 1;
|
|
||||||
tmtm.tm_year = st.wYear - 1900;
|
|
||||||
tmtm.tm_isdst = -1;
|
|
||||||
tt = mktime (&tmtm);
|
|
||||||
tp->tv_sec = tt;
|
|
||||||
tp->tv_usec = st.wMilliseconds * 1000;
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
** The earlier time calculations using GetLocalTime
|
|
||||||
** had a time resolution of 10ms.The timeGetTime, part
|
|
||||||
** of multimedia apis offer a better time resolution
|
|
||||||
** of 1ms.Need to link against winmm.lib for this
|
|
||||||
**/
|
|
||||||
unsigned long Ticks = 0;
|
|
||||||
unsigned long Sec =0;
|
|
||||||
unsigned long Usec = 0;
|
|
||||||
Ticks = timeGetTime();
|
|
||||||
|
|
||||||
Sec = Ticks/1000;
|
|
||||||
Usec = (Ticks - (Sec*1000))*1000;
|
|
||||||
tp->tv_sec = Sec;
|
|
||||||
tp->tv_usec = Usec;
|
|
||||||
#endif /* WITHOUT_MM_LIB */
|
|
||||||
(void)nothing;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else /* WIN32 */
|
|
||||||
/* non-win32 version of Curl_gettimeofday() */
|
|
||||||
static int gettimeofday(struct timeval *tp, void *nothing)
|
|
||||||
{
|
|
||||||
(void)nothing; /* we don't support specific time-zones */
|
|
||||||
tp->tv_sec = (long)time(NULL);
|
|
||||||
tp->tv_usec = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* WIN32 */
|
|
||||||
#endif /* HAVE_GETTIMEOFDAY */
|
|
||||||
|
|
||||||
/* Return the current time in a timeval struct */
|
|
||||||
struct timeval tutil_tvnow(void)
|
struct timeval tutil_tvnow(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
** GetTickCount() is available on _all_ Windows versions from W95 up
|
||||||
|
** to nowadays. Returns milliseconds elapsed since last system boot,
|
||||||
|
** increases monotonically and wraps once 49.7 days have elapsed.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
DWORD milliseconds = GetTickCount();
|
||||||
|
now.tv_sec = milliseconds / 1000;
|
||||||
|
now.tv_usec = (milliseconds % 1000) * 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
||||||
|
|
||||||
|
struct timeval tutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** clock_gettime() is granted to be increased monotonically when the
|
||||||
|
** monotonic clock is queried. Time starting point is unspecified, it
|
||||||
|
** could be the system start-up time, the Epoch, or something else,
|
||||||
|
** in any case the time starting point does not change once that the
|
||||||
|
** system has started up.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
struct timespec tsnow;
|
||||||
|
(void)clock_gettime(CLOCK_MONOTONIC, &tsnow)
|
||||||
|
now.tv_sec = tsnow.tv_sec;
|
||||||
|
now.tv_usec = tsnow.tv_nsec / 1000;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_GETTIMEOFDAY)
|
||||||
|
|
||||||
|
struct timeval tutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** gettimeofday() is not granted to be increased monotonically, due to
|
||||||
|
** clock drifting and external source time synchronization it can jump
|
||||||
|
** forward or backward in time.
|
||||||
|
*/
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
(void)gettimeofday(&now, NULL);
|
(void)gettimeofday(&now, NULL);
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
struct timeval tutil_tvnow(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** time() returns the value of time in seconds since the Epoch.
|
||||||
|
*/
|
||||||
|
struct timeval now;
|
||||||
|
now.tv_sec = (long)time(NULL);
|
||||||
|
now.tv_usec = 0;
|
||||||
|
return now;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure that the first argument is the more recent time, as otherwise
|
* Make sure that the first argument is the more recent time, as otherwise
|
||||||
* we'll get a weird negative time-diff back...
|
* we'll get a weird negative time-diff back...
|
||||||
|
Loading…
x
Reference in New Issue
Block a user