lib: change progress bitwise ops to bitfields

Since they are mostly independent, using them as bitfelds makes the code
easier.

- remove the unused struct field 'width'.

- convert 'speeder_c' to an unsigned char from int

Closes #17431
This commit is contained in:
Daniel Stenberg 2025-05-23 16:47:52 +02:00
parent 37b25f7bb0
commit 129719c29c
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
7 changed files with 39 additions and 45 deletions

View file

@ -987,7 +987,7 @@ CURL *curl_easy_duphandle(CURL *d)
if(dupset(outcurl, data))
goto fail;
outcurl->progress.flags = data->progress.flags;
outcurl->progress.hide = data->progress.hide;
outcurl->progress.callback = data->progress.callback;
#ifndef CURL_DISABLE_COOKIES
@ -1099,7 +1099,7 @@ void curl_easy_reset(CURL *d)
/* zero out PureInfo data: */
Curl_initinfo(data);
data->progress.flags |= PGRS_HIDE;
data->progress.hide = TRUE;
data->state.current_speed = -1; /* init to negative == impossible */
data->state.retrycount = 0; /* reset the retry counter */

View file

@ -422,11 +422,11 @@ static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
*param_offt = data->progress.ul.speed;
break;
case CURLINFO_CONTENT_LENGTH_DOWNLOAD_T:
*param_offt = (data->progress.flags & PGRS_DL_SIZE_KNOWN) ?
*param_offt = data->progress.dl_size_known ?
data->progress.dl.total_size : -1;
break;
case CURLINFO_CONTENT_LENGTH_UPLOAD_T:
*param_offt = (data->progress.flags & PGRS_UL_SIZE_KNOWN) ?
*param_offt = data->progress.ul_size_known ?
data->progress.ul.total_size : -1;
break;
case CURLINFO_TOTAL_TIME_T:
@ -534,11 +534,11 @@ static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
*param_doublep = (double)data->progress.ul.speed;
break;
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
*param_doublep = (data->progress.flags & PGRS_DL_SIZE_KNOWN) ?
*param_doublep = data->progress.dl_size_known ?
(double)data->progress.dl.total_size : -1;
break;
case CURLINFO_CONTENT_LENGTH_UPLOAD:
*param_doublep = (data->progress.flags & PGRS_UL_SIZE_KNOWN) ?
*param_doublep = data->progress.ul_size_known ?
(double)data->progress.ul.total_size : -1;
break;
case CURLINFO_REDIRECT_TIME:

View file

@ -136,8 +136,7 @@ int Curl_pgrsDone(struct Curl_easy *data)
if(rc)
return rc;
if(!(data->progress.flags & PGRS_HIDE) &&
!data->progress.callback)
if(!data->progress.hide && !data->progress.callback)
/* only output if we do not use a progress callback and we are not
* hidden */
fprintf(data->set.err, "\n");
@ -247,18 +246,20 @@ struct curltime Curl_pgrsTime(struct Curl_easy *data, timerid timer)
void Curl_pgrsStartNow(struct Curl_easy *data)
{
data->progress.speeder_c = 0; /* reset the progress meter display */
data->progress.start = curlx_now();
data->progress.is_t_startransfer_set = FALSE;
data->progress.ul.limit.start = data->progress.start;
data->progress.dl.limit.start = data->progress.start;
data->progress.ul.limit.start_size = 0;
data->progress.dl.limit.start_size = 0;
data->progress.dl.cur_size = 0;
data->progress.ul.cur_size = 0;
/* clear all bits except HIDE and HEADERS_OUT */
data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
Curl_ratelimit(data, data->progress.start);
struct Progress *p = &data->progress;
p->speeder_c = 0; /* reset the progress meter display */
p->start = curlx_now();
p->is_t_startransfer_set = FALSE;
p->ul.limit.start = p->start;
p->dl.limit.start = p->start;
p->ul.limit.start_size = 0;
p->dl.limit.start_size = 0;
p->dl.cur_size = 0;
p->ul.cur_size = 0;
/* the sizes are unknown at start */
p->dl_size_known = FALSE;
p->ul_size_known = FALSE;
Curl_ratelimit(data, p->start);
}
/*
@ -361,11 +362,11 @@ void Curl_pgrsSetDownloadSize(struct Curl_easy *data, curl_off_t size)
{
if(size >= 0) {
data->progress.dl.total_size = size;
data->progress.flags |= PGRS_DL_SIZE_KNOWN;
data->progress.dl_size_known = TRUE;
}
else {
data->progress.dl.total_size = 0;
data->progress.flags &= ~PGRS_DL_SIZE_KNOWN;
data->progress.dl_size_known = FALSE;
}
}
@ -373,11 +374,11 @@ void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
{
if(size >= 0) {
data->progress.ul.total_size = size;
data->progress.flags |= PGRS_UL_SIZE_KNOWN;
data->progress.ul_size_known = TRUE;
}
else {
data->progress.ul.total_size = 0;
data->progress.flags &= ~PGRS_UL_SIZE_KNOWN;
data->progress.ul_size_known = FALSE;
}
}
@ -515,7 +516,7 @@ static void progress_meter(struct Curl_easy *data)
char time_spent[10];
curl_off_t cur_secs = (curl_off_t)p->timespent/1000000; /* seconds */
if(!(p->flags & PGRS_HEADERS_OUT)) {
if(!p->headers_out) {
if(data->state.resume_from) {
fprintf(data->set.err,
"** Resuming transfer from byte position %" FMT_OFF_T "\n",
@ -526,12 +527,12 @@ static void progress_meter(struct Curl_easy *data)
"Time Time Time Current\n"
" Dload Upload "
"Total Spent Left Speed\n");
p->flags |= PGRS_HEADERS_OUT; /* headers are shown */
p->headers_out = TRUE; /* headers are shown */
}
/* Figure out the estimated time of arrival for upload and download */
pgrs_estimates(&p->ul, (p->flags & PGRS_UL_SIZE_KNOWN), &ul_estm);
pgrs_estimates(&p->dl, (p->flags & PGRS_DL_SIZE_KNOWN), &dl_estm);
pgrs_estimates(&p->ul, (bool)p->ul_size_known, &ul_estm);
pgrs_estimates(&p->dl, (bool)p->dl_size_known, &dl_estm);
/* Since both happen at the same time, total expected duration is max. */
total_estm.secs = CURLMAX(ul_estm.secs, dl_estm.secs);
@ -542,10 +543,10 @@ static void progress_meter(struct Curl_easy *data)
/* Get the total amount of data expected to get transferred */
total_expected_size =
((p->flags & PGRS_UL_SIZE_KNOWN) ? p->ul.total_size : p->ul.cur_size);
p->ul_size_known ? p->ul.total_size : p->ul.cur_size;
dl_size =
((p->flags & PGRS_DL_SIZE_KNOWN) ? p->dl.total_size : p->dl.cur_size);
p->dl_size_known ? p->dl.total_size : p->dl.cur_size;
/* integer overflow check */
if((CURL_OFF_T_MAX - total_expected_size) < dl_size)
@ -593,7 +594,7 @@ static void progress_meter(struct Curl_easy *data)
*/
static int pgrsupdate(struct Curl_easy *data, bool showprogress)
{
if(!(data->progress.flags & PGRS_HIDE)) {
if(!data->progress.hide) {
if(data->set.fxferinfo) {
int result;
/* There is a callback set, call that */

View file

@ -71,9 +71,4 @@ void Curl_pgrsTimeWas(struct Curl_easy *data, timerid timer,
void Curl_pgrsEarlyData(struct Curl_easy *data, curl_off_t sent);
#define PGRS_HIDE (1<<4)
#define PGRS_UL_SIZE_KNOWN (1<<5)
#define PGRS_DL_SIZE_KNOWN (1<<6)
#define PGRS_HEADERS_OUT (1<<7) /* set when the headers have been written */
#endif /* HEADER_CURL_PROGRESS_H */

View file

@ -473,10 +473,7 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option,
/*
* Shut off the internal supported progress meter
*/
if(enabled)
data->progress.flags |= PGRS_HIDE;
else
data->progress.flags &= ~PGRS_HIDE;
data->progress.hide = enabled;
break;
case CURLOPT_NOBODY:
/*

View file

@ -529,7 +529,7 @@ CURLcode Curl_open(struct Curl_easy **curl)
data->id = -1;
data->mid = UINT_MAX;
data->master_mid = UINT_MAX;
data->progress.flags |= PGRS_HIDE;
data->progress.hide = TRUE;
data->state.current_speed = -1; /* init to negative == impossible */
Curl_hash_init(&data->meta_hash, 23,

View file

@ -978,9 +978,6 @@ struct Progress {
curl_off_t current_speed; /* uses the currently fastest transfer */
curl_off_t earlydata_sent;
int width; /* screen width at download start */
int flags; /* see progress.h */
timediff_t timespent;
timediff_t t_postqueue;
@ -1002,7 +999,11 @@ struct Progress {
curl_off_t speeder[ CURR_TIME ];
struct curltime speeder_time[ CURR_TIME ];
int speeder_c;
unsigned char speeder_c;
BIT(hide);
BIT(ul_size_known);
BIT(dl_size_known);
BIT(headers_out); /* when the headers have been written */
BIT(callback); /* set when progress callback is used */
BIT(is_t_startransfer_set);
};