Commit e60cd444 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.

(cherry picked from commit a544e2e3)
parent 633e034e
......@@ -132,6 +132,31 @@ isc_stats_set(isc_stats_t *stats, uint64_t val,
*\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
#endif /* ISC_STATS_H */
......@@ -151,3 +151,34 @@ isc_stats_set(isc_stats_t *stats, uint64_t val,
atomic_store_explicit(&stats->counters[counter], val,
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));
}
......@@ -539,9 +539,11 @@ isc_stats_create
isc_stats_decrement
isc_stats_detach
isc_stats_dump
isc_stats_get_counter
isc_stats_increment
isc_stats_ncounters
isc_stats_set
isc_stats_update_if_greater
isc_stdio_close
isc_stdio_flush
isc_stdio_open
......
......@@ -123,4 +123,11 @@ ns_stats_decrement(ns_stats_t *stats, isc_statscounter_t counter);
isc_stats_t *
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 */
......@@ -123,3 +123,20 @@ ns_stats_get(ns_stats_t *stats) {
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
ns_stats_decrement
ns_stats_detach
ns_stats_get
ns_stats_get_counter
ns_stats_increment
ns_stats_update_if_greater
ns_update_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