X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_update.c;h=0335a9ef27670a37e1e10675ac3281dac8f9d710;hp=ec1e5fd7dc1f21a97cc05f8e2a9b6cff37a21812;hb=096bb3f53482c95c3d2dd09e8c7b2329f6c1c2ff;hpb=1df0624ce2e0eb3252916ad1e8d7f143911515e6 diff --git a/src/rrd_update.c b/src/rrd_update.c index ec1e5fd..0335a9e 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009 + * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010 * Copyright by Florian Forster, 2008 ***************************************************************************** * rrd_update.c RRD Update Function @@ -212,7 +212,6 @@ static void initialize_cdp_val( unival *scratch, int current_cf, rrd_value_t pdp_temp_val, - unsigned long elapsed_pdp_st, unsigned long start_pdp_offset, unsigned long pdp_cnt); @@ -227,8 +226,9 @@ static void reset_cdp( int cdp_idx, enum cf_en current_cf); -static rrd_value_t initialize_average_carry_over( +static rrd_value_t initialize_carry_over( rrd_value_t pdp_temp_val, + int current_cf, unsigned long elapsed_pdp_st, unsigned long start_pdp_offset, unsigned long pdp_cnt); @@ -1354,6 +1354,10 @@ static int process_pdp_st( rpnp = rpn_expand((rpn_cdefds_t *) &(rrd->ds_def[ds_idx].par[DS_cdef])); + if(rpnp == NULL) { + rpnstack_free(&rpnstack); + return -1; + } /* substitute data values for OP_VARIABLE nodes */ for (i = 0; rpnp[i].op != OP_END; i++) { if (rpnp[i].op == OP_VARIABLE) { @@ -1367,6 +1371,7 @@ static int process_pdp_st( rpnstack_free(&rpnstack); return -1; } + free(rpnp); } /* make pdp_prep ready for the next run */ @@ -1593,18 +1598,15 @@ static void update_cdp( if (*cdp_unkn_pdp_cnt > pdp_cnt * xff) { *cdp_primary_val = DNAN; - if (current_cf == CF_AVERAGE) { - *cdp_val = - initialize_average_carry_over(pdp_temp_val, - elapsed_pdp_st, - start_pdp_offset, pdp_cnt); - } else { - *cdp_val = pdp_temp_val; - } } else { initialize_cdp_val(scratch, current_cf, pdp_temp_val, - elapsed_pdp_st, start_pdp_offset, pdp_cnt); - } /* endif meets xff value requirement for a valid value */ + start_pdp_offset, pdp_cnt); + } + *cdp_val = + initialize_carry_over(pdp_temp_val,current_cf, + elapsed_pdp_st, + start_pdp_offset, pdp_cnt); + /* endif meets xff value requirement for a valid value */ /* initialize carry over CDP_unkn_pdp_cnt, this must after CDP_primary_val * is set because CDP_unkn_pdp_cnt is required to compute that value. */ if (isnan(pdp_temp_val)) @@ -1640,7 +1642,6 @@ static void initialize_cdp_val( unival *scratch, int current_cf, rrd_value_t pdp_temp_val, - unsigned long elapsed_pdp_st, unsigned long start_pdp_offset, unsigned long pdp_cnt) { @@ -1653,13 +1654,11 @@ static void initialize_cdp_val( scratch[CDP_primary_val].u_val = (cum_val + cur_val * start_pdp_offset) / (pdp_cnt - scratch[CDP_unkn_pdp_cnt].u_cnt); - scratch[CDP_val].u_val = - initialize_average_carry_over(pdp_temp_val, elapsed_pdp_st, - start_pdp_offset, pdp_cnt); break; - case CF_MAXIMUM: + case CF_MAXIMUM: cum_val = IFDNAN(scratch[CDP_val].u_val, -DINF); cur_val = IFDNAN(pdp_temp_val, -DINF); + #if 0 #ifdef DEBUG if (isnan(scratch[CDP_val].u_val) && isnan(pdp_temp)) { @@ -1674,8 +1673,6 @@ static void initialize_cdp_val( scratch[CDP_primary_val].u_val = cur_val; else scratch[CDP_primary_val].u_val = cum_val; - /* initialize carry over value */ - scratch[CDP_val].u_val = pdp_temp_val; break; case CF_MINIMUM: cum_val = IFDNAN(scratch[CDP_val].u_val, DINF); @@ -1694,14 +1691,10 @@ static void initialize_cdp_val( scratch[CDP_primary_val].u_val = cur_val; else scratch[CDP_primary_val].u_val = cum_val; - /* initialize carry over value */ - scratch[CDP_val].u_val = pdp_temp_val; break; case CF_LAST: default: scratch[CDP_primary_val].u_val = pdp_temp_val; - /* initialize carry over value */ - scratch[CDP_val].u_val = pdp_temp_val; break; } } @@ -1763,17 +1756,34 @@ static void reset_cdp( } } -static rrd_value_t initialize_average_carry_over( +static rrd_value_t initialize_carry_over( rrd_value_t pdp_temp_val, + int current_cf, unsigned long elapsed_pdp_st, unsigned long start_pdp_offset, unsigned long pdp_cnt) { - /* initialize carry over value */ - if (isnan(pdp_temp_val)) { - return DNAN; - } - return pdp_temp_val * ((elapsed_pdp_st - start_pdp_offset) % pdp_cnt); + unsigned long pdp_into_cdp_cnt = ((elapsed_pdp_st - start_pdp_offset) % pdp_cnt); + if ( pdp_into_cdp_cnt == 0 || isnan(pdp_temp_val)){ + switch (current_cf) { + case CF_MAXIMUM: + return -DINF; + case CF_MINIMUM: + return DINF; + case CF_AVERAGE: + return 0; + default: + return DNAN; + } + } + else { + switch (current_cf) { + case CF_AVERAGE: + return pdp_temp_val * pdp_into_cdp_cnt ; + default: + return pdp_temp_val; + } + } } /*