1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] Timer code update.

This commit is contained in:
hniksic 2003-11-07 20:55:44 -08:00
parent caa70d1420
commit 0bd6576cde
5 changed files with 56 additions and 29 deletions

View File

@ -1,3 +1,11 @@
2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
* retr.c (get_contents): Pass the timer to limit_bandwidth().
* utils.c (wtimer_update): New function instead of wget_elapsed;
just update the timer, but don't return anything.
(wtimer_read): Read and return the last known value of the timer.
2003-11-08 Hrvoje Niksic <hniksic@xemacs.org> 2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
* http.c (persistent_available_p): Instead of matching all the * http.c (persistent_available_p): Instead of matching all the

View File

@ -166,7 +166,8 @@ convert_all_links (void)
free_urlpos (urls); free_urlpos (urls);
} }
msecs = wtimer_elapsed (timer); wtimer_update (timer);
msecs = wtimer_read (timer);
wtimer_delete (timer); wtimer_delete (timer);
logprintf (LOG_VERBOSE, _("Converted %d files in %.2f seconds.\n"), logprintf (LOG_VERBOSE, _("Converted %d files in %.2f seconds.\n"),
file_count, (double)msecs / 1000); file_count, (double)msecs / 1000);

View File

@ -84,13 +84,13 @@ limit_bandwidth_reset (void)
} }
/* Limit the bandwidth by pausing the download for an amount of time. /* Limit the bandwidth by pausing the download for an amount of time.
BYTES is the number of bytes received from the network, and DELTA BYTES is the number of bytes received from the network, and TIMER
is the number of milliseconds it took to receive them. */ is the timer that started at the beginning of download. */
static void static void
limit_bandwidth (long bytes, double *dltime, struct wget_timer *timer) limit_bandwidth (long bytes, struct wget_timer *timer)
{ {
double delta_t = *dltime - limit_data.chunk_start; double delta_t = wtimer_read (timer) - limit_data.chunk_start;
double expected; double expected;
limit_data.chunk_bytes += bytes; limit_data.chunk_bytes += bytes;
@ -113,23 +113,20 @@ limit_bandwidth (long bytes, double *dltime, struct wget_timer *timer)
DEBUGP (("\nsleeping %.2f ms for %ld bytes, adjust %.2f ms\n", DEBUGP (("\nsleeping %.2f ms for %ld bytes, adjust %.2f ms\n",
slp, limit_data.chunk_bytes, limit_data.sleep_adjust)); slp, limit_data.chunk_bytes, limit_data.sleep_adjust));
t0 = *dltime; t0 = wtimer_read (timer);
xsleep (slp / 1000); xsleep (slp / 1000);
t1 = wtimer_elapsed (timer); wtimer_update (timer);
t1 = wtimer_read (timer);
/* Due to scheduling, we probably slept slightly longer (or /* Due to scheduling, we probably slept slightly longer (or
shorter) than desired. Calculate the difference between the shorter) than desired. Calculate the difference between the
desired and the actual sleep, and adjust the next sleep by desired and the actual sleep, and adjust the next sleep by
that amount. */ that amount. */
limit_data.sleep_adjust = slp - (t1 - t0); limit_data.sleep_adjust = slp - (t1 - t0);
/* Since we've called wtimer_elapsed, we might as well update
the caller's dltime. */
*dltime = t1;
} }
limit_data.chunk_bytes = 0; limit_data.chunk_bytes = 0;
limit_data.chunk_start = *dltime; limit_data.chunk_start = wtimer_read (timer);
} }
#define MIN(i, j) ((i) <= (j) ? (i) : (j)) #define MIN(i, j) ((i) <= (j) ? (i) : (j))
@ -166,7 +163,6 @@ get_contents (int fd, FILE *fp, long *len, long restval, long expected,
void *progress = NULL; void *progress = NULL;
struct wget_timer *timer = wtimer_allocate (); struct wget_timer *timer = wtimer_allocate ();
double dltime = 0;
*len = restval; *len = restval;
@ -222,7 +218,7 @@ get_contents (int fd, FILE *fp, long *len, long restval, long expected,
/* Always flush the contents of the network packet. This should /* Always flush the contents of the network packet. This should
not hinder performance: fast downloads will be received in not hinder performance: fast downloads will be received in
16K chunks (which stdio would write out anyway), and slow 16K chunks (which stdio would write out anyway), and slow
downloads won't be limited with disk performance. */ downloads won't be limited by disk performance. */
fflush (fp); fflush (fp);
if (ferror (fp)) if (ferror (fp))
{ {
@ -230,13 +226,13 @@ get_contents (int fd, FILE *fp, long *len, long restval, long expected,
goto out; goto out;
} }
dltime = wtimer_elapsed (timer); wtimer_update (timer);
if (opt.limit_rate) if (opt.limit_rate)
limit_bandwidth (res, &dltime, timer); limit_bandwidth (res, timer);
*len += res; *len += res;
if (progress) if (progress)
progress_update (progress, res, dltime); progress_update (progress, res, wtimer_read (timer));
#ifdef WINDOWS #ifdef WINDOWS
if (use_expected && expected > 0) if (use_expected && expected > 0)
ws_percenttitle (100.0 * (double)(*len) / (double)expected); ws_percenttitle (100.0 * (double)(*len) / (double)expected);
@ -247,9 +243,9 @@ get_contents (int fd, FILE *fp, long *len, long restval, long expected,
out: out:
if (progress) if (progress)
progress_finish (progress, dltime); progress_finish (progress, wtimer_read (timer));
if (elapsed) if (elapsed)
*elapsed = dltime; *elapsed = wtimer_read (timer);
wtimer_delete (timer); wtimer_delete (timer);
return res; return res;

View File

@ -1395,8 +1395,11 @@ wtimer_sys_set (wget_sys_time *wst)
} }
/* Reset timer WT. This establishes the starting point from which /* Reset timer WT. This establishes the starting point from which
wtimer_elapsed() will return the number of elapsed wtimer_elapsed() will return the number of elapsed milliseconds.
milliseconds. It is allowed to reset a previously used timer. */ It is allowed to reset a previously used timer.
If a non-zero value is used as START, the timer's values will be
offset by START. */
void void
wtimer_reset (struct wget_timer *wt) wtimer_reset (struct wget_timer *wt)
@ -1427,13 +1430,16 @@ wtimer_sys_diff (wget_sys_time *wst1, wget_sys_time *wst2)
#endif #endif
} }
/* Return the number of milliseconds elapsed since the timer was last /* Update the timer's elapsed interval. This function causes the
reset. It is allowed to call this function more than once to get timer to call gettimeofday (or time(), etc.) to update its idea of
increasingly higher elapsed values. These timers handle clock current time. To get the elapsed interval in milliseconds, use
skew. */ wtimer_read.
double This function handles clock skew, i.e. time that moves backwards is
wtimer_elapsed (struct wget_timer *wt) ignored. */
void
wtimer_update (struct wget_timer *wt)
{ {
wget_sys_time now; wget_sys_time now;
double elapsed; double elapsed;
@ -1462,7 +1468,22 @@ wtimer_elapsed (struct wget_timer *wt)
} }
wt->elapsed_last = elapsed; wt->elapsed_last = elapsed;
return elapsed; }
/* Return the elapsed time in milliseconds between the last call to
wtimer_reset and the last call to wtimer_update.
A typical use of the timer interface would be:
struct wtimer *timer = wtimer_new ();
... do something that takes a while ...
wtimer_update ();
double msecs = wtimer_read (); */
double
wtimer_read (const struct wget_timer *wt)
{
return wt->elapsed_last;
} }
/* Return the assessed granularity of the timer implementation, in /* Return the assessed granularity of the timer implementation, in

View File

@ -111,7 +111,8 @@ struct wget_timer *wtimer_allocate PARAMS ((void));
struct wget_timer *wtimer_new PARAMS ((void)); struct wget_timer *wtimer_new PARAMS ((void));
void wtimer_delete PARAMS ((struct wget_timer *)); void wtimer_delete PARAMS ((struct wget_timer *));
void wtimer_reset PARAMS ((struct wget_timer *)); void wtimer_reset PARAMS ((struct wget_timer *));
double wtimer_elapsed PARAMS ((struct wget_timer *)); void wtimer_update PARAMS ((struct wget_timer *));
double wtimer_read PARAMS ((const struct wget_timer *));
double wtimer_granularity PARAMS ((void)); double wtimer_granularity PARAMS ((void));
char *html_quote_string PARAMS ((const char *)); char *html_quote_string PARAMS ((const char *));