Handle race in stats_arena_bins_print
When multiple threads calling stats_print, race could happen as we read the counters in separate mallctl calls; and the removed assertion could fail when other operations happened in between the mallctl calls. For simplicity, output "race" in the utilization field in this case. This resolves #616.
This commit is contained in:
parent
7c124830a1
commit
7b53fe928e
16
src/stats.c
16
src/stats.c
@ -136,8 +136,16 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque,
|
|||||||
availregs = nregs * curruns;
|
availregs = nregs * curruns;
|
||||||
milli = (availregs != 0) ? (1000 * curregs) / availregs
|
milli = (availregs != 0) ? (1000 * curregs) / availregs
|
||||||
: 1000;
|
: 1000;
|
||||||
assert(milli <= 1000);
|
|
||||||
if (milli < 10) {
|
if (milli > 1000) {
|
||||||
|
/*
|
||||||
|
* Race detected: the counters were read in
|
||||||
|
* separate mallctl calls and concurrent
|
||||||
|
* operations happened in between. In this case
|
||||||
|
* no meaningful utilization can be computed.
|
||||||
|
*/
|
||||||
|
malloc_snprintf(util, sizeof(util), " race");
|
||||||
|
} else if (milli < 10) {
|
||||||
malloc_snprintf(util, sizeof(util),
|
malloc_snprintf(util, sizeof(util),
|
||||||
"0.00%zu", milli);
|
"0.00%zu", milli);
|
||||||
} else if (milli < 100) {
|
} else if (milli < 100) {
|
||||||
@ -146,8 +154,10 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque,
|
|||||||
} else if (milli < 1000) {
|
} else if (milli < 1000) {
|
||||||
malloc_snprintf(util, sizeof(util), "0.%zu",
|
malloc_snprintf(util, sizeof(util), "0.%zu",
|
||||||
milli);
|
milli);
|
||||||
} else
|
} else {
|
||||||
|
assert(milli == 1000);
|
||||||
malloc_snprintf(util, sizeof(util), "1");
|
malloc_snprintf(util, sizeof(util), "1");
|
||||||
|
}
|
||||||
|
|
||||||
if (config_tcache) {
|
if (config_tcache) {
|
||||||
malloc_cprintf(write_cb, cbopaque,
|
malloc_cprintf(write_cb, cbopaque,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user