diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index 6c379ee..5e72594 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -440,6 +440,22 @@ typedef struct pvtransfercalc_s *pvtransfercalc_t; typedef struct pvipcstate_s *pvipcstate_t; typedef struct pvtransferstate_s *pvtransferstate_t; +/* + * Read-only counterparts to the above structure pointers, to be used in + * function declarations where the function definitely shouldn't be altering + * the contents of the structure. + */ +typedef const struct pvprogramstatus_s * const readonly_pvprogramstatus_t; +typedef const struct pvinputfiles_s * const readonly_pvinputfiles_t; +typedef const struct pvcontrol_s * const readonly_pvcontrol_t; +typedef const struct pvsignal_s * const readonly_pvsignal_t; +typedef const struct pvtransientflags_s * const readonly_pvtransientflags_t; +typedef const struct pvdisplay_s * const readonly_pvdisplay_t; +typedef const struct pvdisplay_segment_s * const readonly_pvdisplay_segment_t; +typedef const struct pvtransfercalc_s * const readonly_pvtransfercalc_t; +typedef const struct pvipcstate_s * const readonly_pvipcstate_t; +typedef const struct pvtransferstate_s * const readonly_pvtransferstate_t; + /* * Structure containing the parameters used by formatters. */ @@ -490,7 +506,7 @@ typedef struct pvwatchfd_s *pvwatchfd_t; void pv_error(pvstate_t, char *, ...); int pv_main_loop(pvstate_t); -void pv_calculate_transfer_rate(pvtransfercalc_t, pvtransferstate_t, pvcontrol_t, pvdisplay_t, bool); +void pv_calculate_transfer_rate(pvtransfercalc_t, readonly_pvtransferstate_t, readonly_pvcontrol_t, readonly_pvdisplay_t, bool); long pv_bound_long(long, long, long); long pv_seconds_remaining(const off_t, const off_t, const long double); diff --git a/src/pv/calc.c b/src/pv/calc.c index 4eca7f1..4aac9de 100644 --- a/src/pv/calc.c +++ b/src/pv/calc.c @@ -17,7 +17,7 @@ * rate, otherwise calulate the average rate from the difference between the * current position + elapsed time pair, and the oldest pair in the buffer. */ -static void pv__update_average_rate_history(pvtransfercalc_t calc, pvtransferstate_t transfer, +static void pv__update_average_rate_history(pvtransfercalc_t calc, readonly_pvtransferstate_t transfer, unsigned int history_interval, long double rate) { size_t first = calc->history_first; @@ -65,7 +65,7 @@ static void pv__update_average_rate_history(pvtransfercalc_t calc, pvtransfersta /* - * Update all calculated transfer state (usually state->calc). + * Update all calculated transfer state in calc (usually from state->calc). * * If "final" is true, this is the final update, so calc->transfer_rate and * calc->average_rate are given as an average over the whole transfer; @@ -75,8 +75,8 @@ static void pv__update_average_rate_history(pvtransfercalc_t calc, pvtransfersta * control->size is greater than zero, otherwise it will increase by 2 each * call and wrap at 200. */ -void pv_calculate_transfer_rate(pvtransfercalc_t calc, pvtransferstate_t transfer, pvcontrol_t control, - pvdisplay_t display, bool final) +void pv_calculate_transfer_rate(pvtransfercalc_t calc, readonly_pvtransferstate_t transfer, + readonly_pvcontrol_t control, readonly_pvdisplay_t display, bool final) { off_t bytes_since_last; long double time_since_last, transfer_rate, average_rate; @@ -141,12 +141,13 @@ void pv_calculate_transfer_rate(pvtransfercalc_t calc, pvtransferstate_t transfe * period of the transfer. */ if (final) { + long double total_elapsed_seconds = (long double) (transfer->elapsed_seconds); /* Safety check to avoid division by zero. */ - if (transfer->elapsed_seconds < 0.000001) - transfer->elapsed_seconds = 0.000001; + if (total_elapsed_seconds < 0.000001) + total_elapsed_seconds = 0.000001; average_rate = (((long double) (transfer->transferred)) - - ((long double) display->initial_offset)) / (long double) (transfer->elapsed_seconds); + ((long double) display->initial_offset)) / total_elapsed_seconds; transfer_rate = average_rate; }