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:
parent
caa70d1420
commit
0bd6576cde
@ -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
|
||||||
|
@ -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);
|
||||||
|
32
src/retr.c
32
src/retr.c
@ -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;
|
||||||
|
39
src/utils.c
39
src/utils.c
@ -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
|
||||||
|
@ -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 *));
|
||||||
|
Loading…
Reference in New Issue
Block a user