You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/include/Command_Counter.h

65 lines
1.7 KiB

#ifndef __CLASS_COMMAND_COUNTER_H
#define __CLASS_COMMAND_COUNTER_H
class Command_Counter {
public:
Command_Counter(int cmd_idx, int col_count, char** cmd_desc) : _counters{}, _total_time(0), _cmd_idx(cmd_idx),
_col_count(col_count), _cmd_desc(cmd_desc) {
//memset(_counters, 0, sizeof(_counters));
}
void add_and_reset(Command_Counter* cc) {
for (int j = 0; j < static_cast<int>(sizeof(_counters)/sizeof(_counters[0])); j++) {
if (cc->_counters[j]) {
__sync_fetch_and_add(&_counters[j], cc->_counters[j]);
cc->_counters[j] = 0;
}
}
if (cc->_total_time)
__sync_fetch_and_add(&_total_time, cc->_total_time);
cc->_total_time = 0;
}
unsigned long long add_time(unsigned long long t) {
_total_time += t;
_counters[0]++;
int i = _add_idx(t);
_counters[i + 1]++;
return _total_time;
}
char** get_row() {
char** pta = (char**)malloc(sizeof(char*) * _col_count);
pta[0] = _cmd_desc[_cmd_idx];
itostr(pta[1], _total_time);
for (int i = 0; i < static_cast<int>(sizeof(_counters)/sizeof(_counters[0])); i++) itostr(pta[i + 2], _counters[i]);
return pta;
}
void free_row(char** pta) {
for (int i = 1; i < _col_count; i++) free(pta[i]);
free(pta);
}
private:
unsigned long long _counters[13];
unsigned long long _total_time;
const int _cmd_idx;
const int _col_count;
char** _cmd_desc;
int _add_idx(unsigned long long t) {
if (t <= 100) return 0;
if (t <= 500) return 1;
if (t <= 1000) return 2;
if (t <= 5000) return 3;
if (t <= 10000) return 4;
if (t <= 50000) return 5;
if (t <= 100000) return 6;
if (t <= 500000) return 7;
if (t <= 1000000) return 8;
if (t <= 5000000) return 9;
if (t <= 10000000) return 10;
return 11;
}
};
#endif /* __CLASS_COMMAND_COUNTER_H */