Refactor time diff calculation helper.

This commit is contained in:
Ondrej Kozina
2022-02-14 15:10:49 +01:00
parent 75622b332b
commit 63c79256e4

View File

@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
#include <assert.h>
#include "cryptsetup.h" #include "cryptsetup.h"
#define MINUTES_90 UINT64_C(5400000000) /* 90 minutes in microseconds */ #define MINUTES_90 UINT64_C(5400000000) /* 90 minutes in microseconds */
@@ -149,39 +150,53 @@ static void log_progress_final(uint64_t time_spent, uint64_t bytes, double uib,
log_std(_("Finished, time %s, %s, %s\n"), time, written, speed); log_std(_("Finished, time %s, %s, %s\n"), time, written, speed);
} }
static void tools_time_progress(uint64_t device_size, uint64_t bytes, struct tools_progress_params *parms) static bool calculate_tdiff(bool final, uint64_t bytes, struct tools_progress_params *parms, double *r_tdiff)
{ {
uint64_t frequency;
struct timeval now_time; struct timeval now_time;
uint64_t eta, frequency;
double tdiff, uib; assert(r_tdiff);
const char *eol, *ustr;
bool final = (bytes == device_size);
gettimeofday(&now_time, NULL); gettimeofday(&now_time, NULL);
if (parms->start_time.tv_sec == 0 && parms->start_time.tv_usec == 0) { if (parms->start_time.tv_sec == 0 && parms->start_time.tv_usec == 0) {
parms->start_time = now_time; parms->start_time = now_time;
parms->end_time = now_time; parms->end_time = now_time;
parms->start_offset = bytes; parms->start_offset = bytes;
return; return false;
} }
if (parms->frequency) { if (parms->frequency)
frequency = parms->frequency * UINT64_C(1000000); frequency = parms->frequency * UINT64_C(1000000);
eol = "\n"; else
} else {
frequency = 500000; frequency = 500000;
eol = "";
}
if (!final && time_diff(&parms->end_time, &now_time) < frequency) if (!final && time_diff(&parms->end_time, &now_time) < frequency)
return; return false;
parms->end_time = now_time; parms->end_time = now_time;
tdiff = time_diff(&parms->start_time, &parms->end_time) / 1E6; *r_tdiff = time_diff(&parms->start_time, &parms->end_time) / 1E6;
if (!tdiff) if (!*r_tdiff)
return false;
return true;
}
static void tools_time_progress(uint64_t device_size, uint64_t bytes, struct tools_progress_params *parms)
{
uint64_t eta;
double tdiff, uib;
const char *eol, *ustr;
bool final = (bytes == device_size);
if (!calculate_tdiff(final, bytes, parms, &tdiff))
return; return;
if (parms->frequency)
eol = "\n";
else
eol = "";
uib = (double)(bytes - parms->start_offset) / tdiff; uib = (double)(bytes - parms->start_offset) / tdiff;
eta = (uint64_t)((device_size / uib - tdiff) * 1E6); eta = (uint64_t)((device_size / uib - tdiff) * 1E6);