Commit a544e2e3 authored by Diego dos Santos Fronza's avatar Diego dos Santos Fronza Committed by Ondřej Surý

Add functions for collecting high-water counters

Add {isc,ns}_stats_{update_if_greater,get_counter}() functions that
are used to set and collect high-water type of statistics.
parent eb5611a7
...@@ -132,6 +132,31 @@ isc_stats_set(isc_stats_t *stats, uint64_t val, ...@@ -132,6 +132,31 @@ isc_stats_set(isc_stats_t *stats, uint64_t val,
*\li 'stats' is a valid isc_stats_t. *\li 'stats' is a valid isc_stats_t.
*/ */
void isc_stats_update_if_greater(isc_stats_t *stats,
isc_statscounter_t counter,
isc_statscounter_t value);
/*%<
* Atomically assigns 'value' to 'counter' if value > counter.
*
* Requires:
*\li 'stats' is a valid isc_stats_t.
*
*\li counter is less than the maximum available ID for the stats specified
* on creation.
*/
isc_statscounter_t
isc_stats_get_counter(isc_stats_t *stats, isc_statscounter_t counter);
/*%<
* Returns value currently stored in counter.
*
* Requires:
*\li 'stats' is a valid isc_stats_t.
*
*\li counter is less than the maximum available ID for the stats specified
* on creation.
*/
ISC_LANG_ENDDECLS ISC_LANG_ENDDECLS
#endif /* ISC_STATS_H */ #endif /* ISC_STATS_H */
...@@ -29,17 +29,17 @@ ...@@ -29,17 +29,17 @@
#define ISC_STATS_VALID(x) ISC_MAGIC_VALID(x, ISC_STATS_MAGIC) #define ISC_STATS_VALID(x) ISC_MAGIC_VALID(x, ISC_STATS_MAGIC)
#if defined(_WIN32) && !defined(_WIN64) #if defined(_WIN32) && !defined(_WIN64)
typedef atomic_int_fast32_t isc__atomic_statcounter_t; typedef atomic_int_fast32_t isc_stat_t;
#else #else
typedef atomic_int_fast64_t isc__atomic_statcounter_t; typedef atomic_int_fast64_t isc_stat_t;
#endif #endif
struct isc_stats { struct isc_stats {
unsigned int magic; unsigned int magic;
isc_mem_t *mctx; isc_mem_t *mctx;
isc_refcount_t references; isc_refcount_t references;
int ncounters; int ncounters;
isc__atomic_statcounter_t *counters; isc_stat_t *counters;
}; };
static isc_result_t static isc_result_t
...@@ -149,3 +149,34 @@ isc_stats_set(isc_stats_t *stats, uint64_t val, ...@@ -149,3 +149,34 @@ isc_stats_set(isc_stats_t *stats, uint64_t val,
atomic_store_explicit(&stats->counters[counter], val, atomic_store_explicit(&stats->counters[counter], val,
memory_order_relaxed); memory_order_relaxed);
} }
void isc_stats_update_if_greater(isc_stats_t *stats,
isc_statscounter_t counter,
isc_statscounter_t value)
{
REQUIRE(ISC_STATS_VALID(stats));
REQUIRE(counter < stats->ncounters);
isc_statscounter_t curr_value;
do {
curr_value = atomic_load_explicit(&stats->counters[counter],
memory_order_relaxed);
if (curr_value >= value) {
break;
}
} while (!atomic_compare_exchange_strong(&stats->counters[counter],
&curr_value,
value));
}
isc_statscounter_t
isc_stats_get_counter(isc_stats_t *stats, isc_statscounter_t counter)
{
REQUIRE(ISC_STATS_VALID(stats));
REQUIRE(counter < stats->ncounters);
return (atomic_load_explicit(&stats->counters[counter],
memory_order_relaxed));
}
...@@ -532,9 +532,11 @@ isc_stats_create ...@@ -532,9 +532,11 @@ isc_stats_create
isc_stats_decrement isc_stats_decrement
isc_stats_detach isc_stats_detach
isc_stats_dump isc_stats_dump
isc_stats_get_counter
isc_stats_increment isc_stats_increment
isc_stats_ncounters isc_stats_ncounters
isc_stats_set isc_stats_set
isc_stats_update_if_greater
isc_stdio_close isc_stdio_close
isc_stdio_flush isc_stdio_flush
isc_stdio_open isc_stdio_open
......
...@@ -123,4 +123,11 @@ ns_stats_decrement(ns_stats_t *stats, isc_statscounter_t counter); ...@@ -123,4 +123,11 @@ ns_stats_decrement(ns_stats_t *stats, isc_statscounter_t counter);
isc_stats_t * isc_stats_t *
ns_stats_get(ns_stats_t *stats); ns_stats_get(ns_stats_t *stats);
void ns_stats_update_if_greater(ns_stats_t *stats,
isc_statscounter_t counter,
isc_statscounter_t value);
isc_statscounter_t
ns_stats_get_counter(ns_stats_t *stats, isc_statscounter_t counter);
#endif /* NS_STATS_H */ #endif /* NS_STATS_H */
...@@ -109,3 +109,20 @@ ns_stats_get(ns_stats_t *stats) { ...@@ -109,3 +109,20 @@ ns_stats_get(ns_stats_t *stats) {
return (stats->counters); return (stats->counters);
} }
void ns_stats_update_if_greater(ns_stats_t *stats,
isc_statscounter_t counter,
isc_statscounter_t value)
{
REQUIRE(NS_STATS_VALID(stats));
isc_stats_update_if_greater(stats->counters, counter, value);
}
isc_statscounter_t
ns_stats_get_counter(ns_stats_t *stats, isc_statscounter_t counter)
{
REQUIRE(NS_STATS_VALID(stats));
return (isc_stats_get_counter(stats->counters, counter));
}
...@@ -102,6 +102,8 @@ ns_stats_create ...@@ -102,6 +102,8 @@ ns_stats_create
ns_stats_decrement ns_stats_decrement
ns_stats_detach ns_stats_detach
ns_stats_get ns_stats_get
ns_stats_get_counter
ns_stats_increment ns_stats_increment
ns_stats_update_if_greater
ns_update_start ns_update_start
ns_xfr_start ns_xfr_start
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment