Returning the value allows for better high-water tracking without
running into edge cases like the following:
0. The counter is at value X
1. Increment the value (X+1)
2. The value is decreased multiple times in another threads (X+1-Y)
3. Get the value (X+1-Y)
4. Update-if-greater misses the X+1 value which should have been the
high-water
*
*/
-void
+isc_statscounter_t
isc_stats_increment(isc_stats_t *stats, isc_statscounter_t counter);
/*%<
- * Increment the counter-th counter of stats.
+ * Increment the counter-th counter of stats and return the old value.
*
* Requires:
*\li 'stats' is a valid isc_stats_t.
*statsp = stats;
}
-void
+isc_statscounter_t
isc_stats_increment(isc_stats_t *stats, isc_statscounter_t counter) {
REQUIRE(ISC_STATS_VALID(stats));
REQUIRE(counter < stats->ncounters);
- atomic_fetch_add_relaxed(&stats->counters[counter], 1);
+ return (atomic_fetch_add_relaxed(&stats->counters[counter], 1));
}
void
void
ns_stats_create(isc_mem_t *mctx, int ncounters, ns_stats_t **statsp);
-void
+isc_statscounter_t
ns_stats_increment(ns_stats_t *stats, isc_statscounter_t counter);
void
/*%
* Increment/Decrement methods
*/
-void
+isc_statscounter_t
ns_stats_increment(ns_stats_t *stats, isc_statscounter_t counter) {
REQUIRE(NS_STATS_VALID(stats));
- isc_stats_increment(stats->counters, counter);
+ return (isc_stats_increment(stats->counters, counter));
}
void