struct extra_counters {
char **datap; /* points to pointer to heap containing counters allocated in a linear fashion */
size_t size; /* size of allocated data */
+ size_t tgrp_step; /* distance in words between two datap for consecutive tgroups, 0 for single */
enum counters_type type; /* type of object containing the counters */
};
((void *)(*(counters)->datap + (mod)->counters_off[(counters)->type])) : \
(trash_counters))
-#define EXTRA_COUNTERS_REGISTER(counters, ctype, alloc_failed_label, storage) \
+#define EXTRA_COUNTERS_REGISTER(counters, ctype, alloc_failed_label, storage, step) \
do { \
typeof(*counters) _ctr; \
_ctr = calloc(1, sizeof(*_ctr)); \
if (!_ctr) \
goto alloc_failed_label; \
_ctr->type = (ctype); \
+ _ctr->tgrp_step = (step); \
_ctr->datap = (storage); \
*(counters) = _ctr; \
} while (0)
}
int stats_allocate_proxy_counters_internal(struct extra_counters **counters,
- int type, int px_cap, char **storage);
+ int type, int px_cap,
+ char **storage, size_t step);
int stats_allocate_proxy_counters(struct proxy *px);
void stats_register_module(struct stats_module *m);
if (!stats_allocate_proxy_counters_internal(&px->extra_counters_be,
COUNTERS_BE,
STATS_PX_CAP_BE,
- &px->per_tgrp->extra_counters_be_storage)) {
+ &px->per_tgrp->extra_counters_be_storage,
+ &px->per_tgrp[1].extra_counters_be_storage -
+ &px->per_tgrp[0].extra_counters_be_storage)) {
memprintf(&msg, "failed to allocate extra counters");
goto err;
}
list_for_each_entry(resolvers, &sec_resolvers, list) {
list_for_each_entry(ns, &resolvers->nameservers, list) {
EXTRA_COUNTERS_REGISTER(&ns->extra_counters, COUNTERS_RSLV,
- alloc_failed, &ns->extra_counters_storage);
+ alloc_failed, &ns->extra_counters_storage, 0);
list_for_each_entry(mod, stat_modules, list) {
EXTRA_COUNTERS_ADD(mod,
if (!stats_allocate_proxy_counters_internal(&srv->extra_counters,
COUNTERS_SV,
STATS_PX_CAP_SRV,
- &srv->per_tgrp->extra_counters_storage)) {
+ &srv->per_tgrp->extra_counters_storage,
+ &srv->per_tgrp[1].extra_counters_storage -
+ &srv->per_tgrp[0].extra_counters_storage)) {
ha_alert("failed to allocate extra counters for server.\n");
goto out;
}
}
int stats_allocate_proxy_counters_internal(struct extra_counters **counters,
- int type, int px_cap, char **storage)
+ int type, int px_cap,
+ char **storage, size_t step)
{
struct stats_module *mod;
- EXTRA_COUNTERS_REGISTER(counters, type, alloc_failed, storage);
+ EXTRA_COUNTERS_REGISTER(counters, type, alloc_failed, storage, step);
list_for_each_entry(mod, &stats_module_list[STATS_DOMAIN_PROXY], list) {
if (!(stats_px_get_cap(mod->domain_flags) & px_cap))
if (!stats_allocate_proxy_counters_internal(&px->extra_counters_fe,
COUNTERS_FE,
STATS_PX_CAP_FE,
- &px->per_tgrp->extra_counters_fe_storage)) {
+ &px->per_tgrp->extra_counters_fe_storage,
+ &px->per_tgrp[1].extra_counters_fe_storage -
+ &px->per_tgrp[0].extra_counters_fe_storage)) {
return 0;
}
}
if (!stats_allocate_proxy_counters_internal(&px->extra_counters_be,
COUNTERS_BE,
STATS_PX_CAP_BE,
- &px->per_tgrp->extra_counters_be_storage)) {
+ &px->per_tgrp->extra_counters_be_storage,
+ &px->per_tgrp[1].extra_counters_be_storage -
+ &px->per_tgrp[0].extra_counters_be_storage)) {
return 0;
}
}
if (!stats_allocate_proxy_counters_internal(&sv->extra_counters,
COUNTERS_SV,
STATS_PX_CAP_SRV,
- &sv->per_tgrp->extra_counters_storage)) {
+ &sv->per_tgrp->extra_counters_storage,
+ &sv->per_tgrp[1].extra_counters_storage -
+ &sv->per_tgrp[0].extra_counters_storage)) {
return 0;
}
}
if (!stats_allocate_proxy_counters_internal(&li->extra_counters,
COUNTERS_LI,
STATS_PX_CAP_LI,
- &li->extra_counters_storage)) {
+ &li->extra_counters_storage, 0)) {
return 0;
}
}