diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2019-09-10 09:43:04 -0400 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2019-09-10 09:43:04 -0400 |
commit | 7c3ad2bf3d4c5cac82146b3359134137bc6d83ff (patch) | |
tree | 7831287ee49e8e9ee12b22887c409fd3620fc391 | |
parent | abc7fc68f8ce227db5a1ce881a8f065577c764dd (diff) | |
download | egawk-7c3ad2bf3d4c5cac82146b3359134137bc6d83ff.tar.gz egawk-7c3ad2bf3d4c5cac82146b3359134137bc6d83ff.tar.bz2 egawk-7c3ad2bf3d4c5cac82146b3359134137bc6d83ff.zip |
Update the typeof(PROCINFO) hack to return memory highwater and active counts.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | awk.h | 5 | ||||
-rw-r--r-- | builtin.c | 33 | ||||
-rw-r--r-- | node.c | 8 |
4 files changed, 51 insertions, 8 deletions
@@ -1,3 +1,16 @@ +2019-09-10 Andrew J. Schorr <aschorr@telemetry-investments.com> + + * awk.h (block_header): Remove cnt field and replace it with + highwater. If MEMDEBUG is defined, add active counter. + * node.c (r_getblock): The cnt field was replaced by active. Update + highwater as appropriate. + (r_freeblock): Decrement the active counter (renamed from cnt). + (more_blocks): Bump the highwater counter (renamed from cnt). + * builtin.c (do_typeof): When providing PROCINFO debug memory stats, + replace count_<blah> with <blah>_active and <blah>_highwater. When + MEMDEBUG is not set, we calculate the active value by subtracting the + number of elements in the free list from the highwater value. + 2019-09-01 Arnold D. Robbins <arnold@skeeve.com> * profile.c (pp_list, pp_concat): Fix use-after-free errors @@ -1062,7 +1062,10 @@ struct block_header { struct block_item *freep; size_t size; const char *name; - long cnt; + long highwater; +#ifdef MEMDEBUG + long active; +#endif }; enum block_id { @@ -4055,10 +4055,35 @@ do_typeof(int nargs) int i; for (i = 0; i < BLOCK_MAX; i++) { char *p; - size_t l = 6 + strlen(nextfree[i].name); - emalloc(p, char *, l+1, "do_typeof"); - sprintf(p, "count_%s", nextfree[i].name); - assoc_set(dbg, make_str_node(p, l, ALREADY_MALLOCED), make_number((AWKNUM) (nextfree[i].cnt))); + size_t nl = strlen(nextfree[i].name); + /* + * save values before we create new + * array elements so that we have a + * snapshot at a consistent moment in + * time + */ + long hw = nextfree[i].highwater; + long active; +#ifdef MEMDEBUG + active = nextfree[i].active; +#else + active = hw; + { + struct block_item *ip; + for (ip = nextfree[i].freep; ip; ip = ip->freep) + active--; + } +#endif + +#define SETVAL(X, V) { \ + size_t l = nl + sizeof(#X); \ + emalloc(p, char *, l+1, "do_typeof"); \ + sprintf(p, "%s_" #X, nextfree[i].name); \ + assoc_set(dbg, make_str_node(p, l, ALREADY_MALLOCED), make_number((AWKNUM) (V))); \ +} + SETVAL(highwater, hw) + SETVAL(active, active) +#undef SETVAL } } } @@ -1041,14 +1041,16 @@ r_getblock(int id) { void *res; emalloc(res, void *, nextfree[id].size, "getblock"); - nextfree[id].cnt++; + nextfree[id].active++; + if (nextfree[id].highwater < nextfree[id].active) + nextfree[id].highwater = nextfree[id].active; return res; } void r_freeblock(void *p, int id) { - nextfree[id].cnt--; + nextfree[id].active--; free(p); } @@ -1081,7 +1083,7 @@ more_blocks(int id) np->freep = next; } nextfree[id].freep = freep->freep; - nextfree[id].cnt += BLOCKCHUNK; + nextfree[id].highwater += BLOCKCHUNK; return freep; } |