Skip to content

Commit

Permalink
Internal time differences now use monotonic time source if available.
Browse files Browse the repository at this point in the history
This also implies the removal of the winmm.lib dependency for WIN32.
  • Loading branch information
yangtse committed May 9, 2008
1 parent d708ef6 commit 19479ea
Show file tree
Hide file tree
Showing 17 changed files with 176 additions and 208 deletions.
4 changes: 4 additions & 0 deletions CHANGES
Expand Up @@ -7,6 +7,10 @@
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)
- 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
Expand Down
1 change: 1 addition & 0 deletions RELEASE-NOTES
Expand Up @@ -33,6 +33,7 @@ This release includes the following bugfixes:
o microsecond resolution keys for internal splay trees
o krb4 and krb5 ftp segfault
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:

Expand Down
31 changes: 1 addition & 30 deletions configure.ac
Expand Up @@ -674,36 +674,6 @@ if test x$CURL_DISABLE_LDAP != x1 ; then
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 Checks for IPv6
dnl **********************************************************************
Expand Down Expand Up @@ -2006,6 +1976,7 @@ AC_CHECK_FUNCS( strtoll \
strcmpi \
gethostbyaddr \
gettimeofday \
clock_gettime \
inet_addr \
inet_ntoa \
inet_pton \
Expand Down
2 changes: 1 addition & 1 deletion docs/INSTALL.devcpp
Expand Up @@ -239,7 +239,7 @@ Linker Links
checked.

3- Include in the white space immediately below the box referred in 2 -lcurl
-lws2_32 -lwinmm.
-lws2_32.

SSL Files
---------
Expand Down
2 changes: 1 addition & 1 deletion docs/examples/Makefile.m32
Expand Up @@ -106,7 +106,7 @@ ifndef USE_LDAP_OPENLDAP
curl_LDADD += -lwldap32
endif
endif
curl_LDADD += -lws2_32 -lwinmm
curl_LDADD += -lws2_32
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)

# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
Expand Down
2 changes: 1 addition & 1 deletion lib/Makefile.Watcom
Expand Up @@ -10,7 +10,7 @@ CC = wcc386

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") &
-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 &
-dWINBERAPI=__declspec(cdecl) -dWINLDAPAPI=__declspec(cdecl) &
-I. -I..\include
Expand Down
2 changes: 1 addition & 1 deletion lib/Makefile.m32
Expand Up @@ -96,7 +96,7 @@ ifndef USE_LDAP_OPENLDAP
DLL_LIBS += -lwldap32
endif
endif
DLL_LIBS += -lws2_32 -lwinmm
DLL_LIBS += -lws2_32
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)

# Makefile.inc provides the CSOURCES and HHEADERS defines
Expand Down
12 changes: 2 additions & 10 deletions lib/Makefile.vc6
Expand Up @@ -66,10 +66,6 @@ WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
!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!

Expand All @@ -85,13 +81,9 @@ LFLAGS = /nologo /machine:$(MACHINE)
SSLLIBS = libeay32.lib ssleay32.lib
ZLIBLIBSDLL= zdll.lib
ZLIBLIBS = zlib.lib
!IFDEF USEMM_LIBS
WINLIBS = wsock32.lib wldap32.lib winmm.lib
!ELSE
WINLIBS = wsock32.lib wldap32.lib
CFLAGS = $(CFLAGS) /DWITHOUT_MM_LIB
!ENDIF
# RSAglue.lib was formerly needed in the SSLLIBS
CFLAGS = $(CFLAGS)

CFGSET = FALSE

!IFDEF WINDOWS_SSPI
Expand Down
1 change: 0 additions & 1 deletion lib/config-win32ce.h
Expand Up @@ -350,7 +350,6 @@
#define CURL_DISABLE_FILE 1
#define CURL_DISABLE_TELNET 1
#define CURL_DISABLE_LDAP 1
#define WITHOUT_MM_LIB 1

#ifdef HAVE_WINDOWS_H
# ifndef WIN32_LEAN_AND_MEAN
Expand Down
4 changes: 2 additions & 2 deletions lib/msvcproj.head
Expand Up @@ -54,7 +54,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
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 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"

Expand All @@ -81,7 +81,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
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 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

!ENDIF
Expand Down
4 changes: 2 additions & 2 deletions lib/select.c
Expand Up @@ -184,7 +184,7 @@ int Curl_socket_ready(curl_socket_t readfd, curl_socket_t writefd,
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
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
Expand Down Expand Up @@ -368,7 +368,7 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms)
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
when function is called with a zero timeout or a negative timeout
value indicating a blocking call should be performed. */
Expand Down
103 changes: 52 additions & 51 deletions lib/timeval.c
Expand Up @@ -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
* you should have received as part of this distribution. The terms
Expand All @@ -23,69 +23,70 @@

#include "timeval.h"

#ifndef HAVE_GETTIMEOFDAY
#if defined(WIN32) && !defined(MSDOS)

#ifdef WIN32
#include <mmsystem.h>

static int gettimeofday(struct timeval *tp, void *nothing)
struct timeval curlx_tvnow(void)
{
#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;
/*
** 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;
}
#else /* WIN32 */
/* non-win32 version of Curl_gettimeofday() */
static int gettimeofday(struct timeval *tp, void *nothing)

#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)

struct timeval curlx_tvnow(void)
{
(void)nothing; /* we don't support specific time-zones */
tp->tv_sec = (long)time(NULL);
tp->tv_usec = 0;
return 0;
/*
** 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;
}
#endif /* WIN32 */
#endif /* HAVE_GETTIMEOFDAY */

/* Return the current time in a timeval struct */
#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;
(void)gettimeofday(&now, NULL);
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
* we'll get a weird negative time-diff back...
Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.Watcom
Expand Up @@ -7,7 +7,7 @@
CC = wcc386

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 &
-I..\include -I..\lib

Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.m32
Expand Up @@ -104,7 +104,7 @@ ifndef USE_LDAP_OPENLDAP
curl_LDADD += -lwldap32
endif
endif
curl_LDADD += -lws2_32 -lwinmm
curl_LDADD += -lws2_32
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)

# Makefile.inc provides the CSOURCES and HHEADERS defines
Expand Down
6 changes: 2 additions & 4 deletions src/Makefile.vc6
Expand Up @@ -10,8 +10,6 @@
## Comments to: Troy Engel <tengel@sonic.net>
## Updated by: Craig Davison <cd@securityfocus.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
#
#############################################################

Expand Down Expand Up @@ -221,8 +219,8 @@ LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
!ENDIF


LINKLIBS = $(LINKLIBS) wsock32.lib wldap32.lib winmm.lib
LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) wsock32.lib wldap32.lib winmm.lib
LINKLIBS = $(LINKLIBS) wsock32.lib wldap32.lib
LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) wsock32.lib wldap32.lib

all : release

Expand Down

0 comments on commit 19479ea

Please sign in to comment.