mirror of https://github.com/moparisthebest/curl
time: fix type conversions and compiler warnings
Fix bugs and compiler warnings on systems with 32-bit long and 64-bit time_t. Reviewed-by: Daniel Stenberg Closes #1499
This commit is contained in:
parent
b4d87f54d6
commit
8ab22a7453
|
@ -373,7 +373,6 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
|
||||||
/* Wait for the name resolve query to complete. */
|
/* Wait for the name resolve query to complete. */
|
||||||
while(!result) {
|
while(!result) {
|
||||||
struct timeval *tvp, tv, store;
|
struct timeval *tvp, tv, store;
|
||||||
long timediff;
|
|
||||||
int itimeout;
|
int itimeout;
|
||||||
int timeout_ms;
|
int timeout_ms;
|
||||||
|
|
||||||
|
@ -402,8 +401,13 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
|
||||||
result = CURLE_ABORTED_BY_CALLBACK;
|
result = CURLE_ABORTED_BY_CALLBACK;
|
||||||
else {
|
else {
|
||||||
struct timeval now2 = Curl_tvnow();
|
struct timeval now2 = Curl_tvnow();
|
||||||
timediff = Curl_tvdiff(now2, now); /* spent time */
|
time_t timediff = Curl_tvdiff(now2, now); /* spent time */
|
||||||
timeout -= timediff?timediff:1; /* always deduct at least 1 */
|
if(timediff <= 0)
|
||||||
|
timeout -= 1; /* always deduct at least 1 */
|
||||||
|
else if(timediff > timeout)
|
||||||
|
timeout = -1;
|
||||||
|
else
|
||||||
|
timeout -= (long)timediff;
|
||||||
now = now2; /* for next loop */
|
now = now2; /* for next loop */
|
||||||
}
|
}
|
||||||
if(timeout < 0)
|
if(timeout < 0)
|
||||||
|
|
12
lib/easy.c
12
lib/easy.c
|
@ -615,12 +615,18 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ev->msbump)
|
if(!ev->msbump) {
|
||||||
/* If nothing updated the timeout, we decrease it by the spent time.
|
/* If nothing updated the timeout, we decrease it by the spent time.
|
||||||
* If it was updated, it has the new timeout time stored already.
|
* If it was updated, it has the new timeout time stored already.
|
||||||
*/
|
*/
|
||||||
ev->ms += (long)curlx_tvdiff(after, before);
|
time_t timediff = curlx_tvdiff(after, before);
|
||||||
|
if(timediff > 0) {
|
||||||
|
if(timediff > ev->ms)
|
||||||
|
ev->ms = 0;
|
||||||
|
else
|
||||||
|
ev->ms -= (long)timediff;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return CURLE_RECV_ERROR;
|
return CURLE_RECV_ERROR;
|
||||||
|
|
|
@ -596,7 +596,7 @@ int Curl_resolv_timeout(struct connectdata *conn,
|
||||||
/* Ignore the timeout when signals are disabled */
|
/* Ignore the timeout when signals are disabled */
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
else
|
else
|
||||||
timeout = timeoutms;
|
timeout = (timeoutms > LONG_MAX) ? LONG_MAX : (long)timeoutms;
|
||||||
|
|
||||||
if(!timeout)
|
if(!timeout)
|
||||||
/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */
|
/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */
|
||||||
|
@ -688,10 +688,11 @@ clean_up:
|
||||||
the time we spent until now! */
|
the time we spent until now! */
|
||||||
if(prev_alarm) {
|
if(prev_alarm) {
|
||||||
/* there was an alarm() set before us, now put it back */
|
/* there was an alarm() set before us, now put it back */
|
||||||
unsigned long elapsed_ms = Curl_tvdiff(Curl_tvnow(), conn->created);
|
unsigned long elapsed_secs = (unsigned long) (Curl_tvdiff(Curl_tvnow(),
|
||||||
|
conn->created) / 1000);
|
||||||
|
|
||||||
/* the alarm period is counted in even number of seconds */
|
/* the alarm period is counted in even number of seconds */
|
||||||
unsigned long alarm_set = prev_alarm - elapsed_ms/1000;
|
unsigned long alarm_set = prev_alarm - elapsed_secs;
|
||||||
|
|
||||||
if(!alarm_set ||
|
if(!alarm_set ||
|
||||||
((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
|
((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
|
||||||
|
|
|
@ -141,9 +141,3 @@ double curlx_tvdiff_secs(struct timeval newer, struct timeval older)
|
||||||
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the number of seconds in the given input timeval struct */
|
|
||||||
time_t Curl_tvlong(struct timeval t1)
|
|
||||||
{
|
|
||||||
return t1.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,8 +46,6 @@ time_t curlx_tvdiff(struct timeval t1, struct timeval t2);
|
||||||
*/
|
*/
|
||||||
double curlx_tvdiff_secs(struct timeval t1, struct timeval t2);
|
double curlx_tvdiff_secs(struct timeval t1, struct timeval t2);
|
||||||
|
|
||||||
time_t Curl_tvlong(struct timeval t1);
|
|
||||||
|
|
||||||
/* These two defines below exist to provide the older API for library
|
/* These two defines below exist to provide the older API for library
|
||||||
internals only. */
|
internals only. */
|
||||||
#define Curl_tvnow() curlx_tvnow()
|
#define Curl_tvnow() curlx_tvnow()
|
||||||
|
|
|
@ -121,8 +121,8 @@ struct timeval tool_tvnow(void)
|
||||||
*/
|
*/
|
||||||
long tool_tvdiff(struct timeval newer, struct timeval older)
|
long tool_tvdiff(struct timeval newer, struct timeval older)
|
||||||
{
|
{
|
||||||
return (newer.tv_sec-older.tv_sec)*1000+
|
return (long)(newer.tv_sec-older.tv_sec)*1000+
|
||||||
(newer.tv_usec-older.tv_usec)/1000;
|
(long)(newer.tv_usec-older.tv_usec)/1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -137,10 +137,3 @@ double tool_tvdiff_secs(struct timeval newer, struct timeval older)
|
||||||
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the number of seconds in the given input timeval struct */
|
|
||||||
long tool_tvlong(struct timeval t1)
|
|
||||||
{
|
|
||||||
return t1.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -45,12 +45,10 @@ long tool_tvlong(struct timeval t1);
|
||||||
#undef tvnow
|
#undef tvnow
|
||||||
#undef tvdiff
|
#undef tvdiff
|
||||||
#undef tvdiff_secs
|
#undef tvdiff_secs
|
||||||
#undef tvlong
|
|
||||||
|
|
||||||
#define tvnow() tool_tvnow()
|
#define tvnow() tool_tvnow()
|
||||||
#define tvdiff(a,b) tool_tvdiff((a), (b))
|
#define tvdiff(a,b) tool_tvdiff((a), (b))
|
||||||
#define tvdiff_secs(a,b) tool_tvdiff_secs((a), (b))
|
#define tvdiff_secs(a,b) tool_tvdiff_secs((a), (b))
|
||||||
#define tvlong(a) tool_tvlong((a))
|
|
||||||
|
|
||||||
#endif /* HEADER_CURL_TOOL_UTIL_H */
|
#endif /* HEADER_CURL_TOOL_UTIL_H */
|
||||||
|
|
||||||
|
|
|
@ -31,22 +31,7 @@
|
||||||
|
|
||||||
/* 500 milliseconds allowed. An extreme number but lets be really conservative
|
/* 500 milliseconds allowed. An extreme number but lets be really conservative
|
||||||
to allow old and slow machines to run this test too */
|
to allow old and slow machines to run this test too */
|
||||||
#define MAX_BLOCKED_TIME_US 500000
|
#define MAX_BLOCKED_TIME_MS 500
|
||||||
|
|
||||||
/* return the number of microseconds between two time stamps */
|
|
||||||
static int elapsed(struct timeval *before,
|
|
||||||
struct timeval *after)
|
|
||||||
{
|
|
||||||
ssize_t result;
|
|
||||||
|
|
||||||
result = (after->tv_sec - before->tv_sec) * 1000000 +
|
|
||||||
after->tv_usec - before->tv_usec;
|
|
||||||
if(result < 0)
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
return curlx_sztosi(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int test(char *URL)
|
int test(char *URL)
|
||||||
{
|
{
|
||||||
|
@ -80,7 +65,7 @@ int test(char *URL)
|
||||||
int maxfd = -99;
|
int maxfd = -99;
|
||||||
struct timeval before;
|
struct timeval before;
|
||||||
struct timeval after;
|
struct timeval after;
|
||||||
int e;
|
long e;
|
||||||
|
|
||||||
timeout.tv_sec = 0;
|
timeout.tv_sec = 0;
|
||||||
timeout.tv_usec = 100000L; /* 100 ms */
|
timeout.tv_usec = 100000L; /* 100 ms */
|
||||||
|
@ -105,10 +90,10 @@ int test(char *URL)
|
||||||
abort_on_test_timeout();
|
abort_on_test_timeout();
|
||||||
|
|
||||||
after = tutil_tvnow();
|
after = tutil_tvnow();
|
||||||
e = elapsed(&before, &after);
|
e = tutil_tvdiff(after, before);
|
||||||
fprintf(stderr, "pong = %d\n", e);
|
fprintf(stderr, "pong = %ld\n", e);
|
||||||
|
|
||||||
if(e > MAX_BLOCKED_TIME_US) {
|
if(e > MAX_BLOCKED_TIME_MS) {
|
||||||
res = 100;
|
res = 100;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,23 +44,6 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
|
||||||
return CURL_READFUNC_ABORT;
|
return CURL_READFUNC_ABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct timeval 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static long tvdiff(struct timeval newer, struct timeval older)
|
|
||||||
{
|
|
||||||
return (newer.tv_sec-older.tv_sec)*1000+
|
|
||||||
(newer.tv_usec-older.tv_usec)/1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test(char *URL)
|
int test(char *URL)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
@ -93,7 +76,7 @@ int test(char *URL)
|
||||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||||
multi_add_handle(mcurl, curl);
|
multi_add_handle(mcurl, curl);
|
||||||
|
|
||||||
mp_start = tvnow();
|
mp_start = tutil_tvnow();
|
||||||
|
|
||||||
/* we start some action by calling perform right away */
|
/* we start some action by calling perform right away */
|
||||||
curl_multi_perform(mcurl, &still_running);
|
curl_multi_perform(mcurl, &still_running);
|
||||||
|
@ -137,7 +120,7 @@ int test(char *URL)
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
|
if(tutil_tvdiff(tutil_tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
|
||||||
fprintf(stderr, "ABORTING TEST, since it seems "
|
fprintf(stderr, "ABORTING TEST, since it seems "
|
||||||
"that it would have run forever.\n");
|
"that it would have run forever.\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -167,7 +167,6 @@ int test(char *URL)
|
||||||
for(;;) {
|
for(;;) {
|
||||||
struct timeval interval;
|
struct timeval interval;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
long int msnow, mslast;
|
|
||||||
fd_set rd, wr, exc;
|
fd_set rd, wr, exc;
|
||||||
int maxfd = -99;
|
int maxfd = -99;
|
||||||
long timeout;
|
long timeout;
|
||||||
|
@ -177,9 +176,7 @@ int test(char *URL)
|
||||||
|
|
||||||
if(handlenum < num_handles) {
|
if(handlenum < num_handles) {
|
||||||
now = tutil_tvnow();
|
now = tutil_tvnow();
|
||||||
msnow = now.tv_sec * 1000 + now.tv_usec / 1000;
|
if(tutil_tvdiff(now, last_handle_add) >= urltime[handlenum]) {
|
||||||
mslast = last_handle_add.tv_sec * 1000 + last_handle_add.tv_usec / 1000;
|
|
||||||
if((msnow - mslast) >= urltime[handlenum]) {
|
|
||||||
fprintf(stdout, "Adding handle %d\n", handlenum);
|
fprintf(stdout, "Adding handle %d\n", handlenum);
|
||||||
setup_handle(URL, m, handlenum);
|
setup_handle(URL, m, handlenum);
|
||||||
last_handle_add = now;
|
last_handle_add = now;
|
||||||
|
|
|
@ -174,8 +174,8 @@ static int getMicroSecondTimeout(struct timeval* timeout)
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
ssize_t result;
|
ssize_t result;
|
||||||
now = tutil_tvnow();
|
now = tutil_tvnow();
|
||||||
result = (timeout->tv_sec - now.tv_sec) * 1000000 +
|
result = (ssize_t)((timeout->tv_sec - now.tv_sec) * 1000000 +
|
||||||
timeout->tv_usec - now.tv_usec;
|
timeout->tv_usec - now.tv_usec);
|
||||||
if(result < 0)
|
if(result < 0)
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
|
|
|
@ -111,10 +111,11 @@ struct timeval tutil_tvnow(void)
|
||||||
*/
|
*/
|
||||||
long tutil_tvdiff(struct timeval newer, struct timeval older)
|
long tutil_tvdiff(struct timeval newer, struct timeval older)
|
||||||
{
|
{
|
||||||
return (newer.tv_sec-older.tv_sec)*1000+
|
return (long)(newer.tv_sec-older.tv_sec)*1000+
|
||||||
(newer.tv_usec-older.tv_usec)/1000;
|
(long)(newer.tv_usec-older.tv_usec)/1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Same as tutil_tvdiff but with full usec resolution.
|
* Same as tutil_tvdiff but with full usec resolution.
|
||||||
*
|
*
|
||||||
|
@ -125,13 +126,5 @@ double tutil_tvdiff_secs(struct timeval newer, struct timeval older)
|
||||||
if(newer.tv_sec != older.tv_sec)
|
if(newer.tv_sec != older.tv_sec)
|
||||||
return (double)(newer.tv_sec-older.tv_sec)+
|
return (double)(newer.tv_sec-older.tv_sec)+
|
||||||
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
else
|
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
||||||
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the number of seconds in the given input timeval struct */
|
|
||||||
long tutil_tvlong(struct timeval t1)
|
|
||||||
{
|
|
||||||
return t1.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,6 @@ long tutil_tvdiff(struct timeval t1, struct timeval t2);
|
||||||
*/
|
*/
|
||||||
double tutil_tvdiff_secs(struct timeval t1, struct timeval t2);
|
double tutil_tvdiff_secs(struct timeval t1, struct timeval t2);
|
||||||
|
|
||||||
long tutil_tvlong(struct timeval t1);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HEADER_CURL_LIBTEST_TESTUTIL_H */
|
#endif /* HEADER_CURL_LIBTEST_TESTUTIL_H */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue