+struct last_data
+{
+ char dset_name[DATA_MAX_NAME_LEN];
+ char ds_name[MAX_RRD_DS_NAME_LEN];
+ double last_sum;
+ uint64_t last_count;
+};
+
+int add_last(const char *dset_n, const char *ds_n, double cur_sum, uint64_t cur_count)
+{
+ last_poll_data[last_idx] = malloc(1 * sizeof(struct last_data));
+ if(!last_poll_data[last_idx])
+ {
+ return ENOMEM;
+ }
+ sstrncpy(last_poll_data[last_idx]->dset_name,dset_n,sizeof(last_poll_data[last_idx]->dset_name));
+ sstrncpy(last_poll_data[last_idx]->ds_name,ds_n,sizeof(last_poll_data[last_idx]->ds_name));
+ last_poll_data[last_idx]->last_sum = cur_sum;
+ last_poll_data[last_idx]->last_count = cur_count;
+ last_idx++;
+ return 1;
+}
+
+int update_last(const char *dset_n, const char *ds_n, double cur_sum, uint64_t cur_count)
+{
+ int i;
+ for(i = 0; i < last_idx; i++)
+ {
+ if(strcmp(last_poll_data[i]->dset_name,dset_n) == 0)
+ {
+ if(strcmp(last_poll_data[i]->ds_name,ds_n) == 0)
+ {
+ last_poll_data[i]->last_sum = cur_sum;
+ last_poll_data[i]->last_count = cur_count;
+ return 1;
+ }
+ }
+ }
+
+ if(NULL == last_poll_data)
+ {
+ last_poll_data = malloc(1 * sizeof(struct last_data *));
+ if(!last_poll_data)
+ {
+ return ENOMEM;
+ }
+ }
+ else
+ {
+ struct last_data **tmp_last = realloc(last_poll_data, ((last_idx+1) * sizeof(struct last_data *)));
+ if(!tmp_last)
+ {
+ return ENOMEM;
+ }
+ last_poll_data = tmp_last;
+ }
+ add_last(dset_n,ds_n,cur_sum,cur_count);
+ return -1;
+}
+
+double get_last_avg(const char *dset_n, const char *ds_n, double cur_sum, uint64_t cur_count)
+{
+ int i;
+ double result = -1.1;
+ double sum_delt = 0.0;
+ uint64_t count_delt = 0;
+ for(i = 0; i < last_idx; i++)
+ {
+ if(strcmp(last_poll_data[i]->dset_name,dset_n) == 0)
+ {
+ if(strcmp(last_poll_data[i]->ds_name,ds_n) == 0)
+ {
+ if(cur_count < last_poll_data[i]->last_count)
+ {
+ break;
+ }
+ sum_delt = (cur_sum - last_poll_data[i]->last_sum);
+ count_delt = (cur_count - last_poll_data[i]->last_count);
+ result = (sum_delt / count_delt);
+ break;
+ }
+ }
+ }
+
+ result = (result == -1.1) ? NAN : result;
+ update_last(dset_n,ds_n,cur_sum,cur_count);
+ return result;
+}
+