Changeset: 8ccc2f4eef5f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8ccc2f4eef5f Modified Files: gdk/ChangeLog.Mar2025 gdk/gdk_bbp.c gdk/gdk_private.h gdk/gdk_utils.c Branch: Mar2025 Log Message:
Display memory sizes for SIGUSR1 in human-readable format as well. diffs (truncated from 381 to 300 lines): diff --git a/gdk/ChangeLog.Mar2025 b/gdk/ChangeLog.Mar2025 --- a/gdk/ChangeLog.Mar2025 +++ b/gdk/ChangeLog.Mar2025 @@ -1,3 +1,7 @@ # ChangeLog file for GDK # This file is updated with Maddlog +* Tue Aug 5 2025 Sjoerd Mullender <[email protected]> +- The SIGUSR1 output now displays counts for memory sizes in a + human-readable format next to the original byte counts. + diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -4691,70 +4691,231 @@ BBPprintinfo(void) } BBPtmunlock(); printf("BATs:\n"); + char mbuf[24], vbuf[24]; if (bats[1][1][1][1][1].nr > 0) - printf("fix, dirty, persistent, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][1][1][1][1].nr, bats[1][1][1][1][1].vmsz, bats[1][1][1][1][1].sz); + printf("fix, dirty, persistent, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][1][1][1].nr, + bats[1][1][1][1][1].vmsz, + humansize(bats[1][1][1][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][1][1][1].sz, + humansize(bats[1][1][1][1][1].sz, mbuf, sizeof(mbuf))); if (bats[1][1][1][1][0].nr > 0) - printf("fix, dirty, persistent, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][1][1][1][0].nr, bats[1][1][1][1][0].vmsz, bats[1][1][1][1][0].sz); + printf("fix, dirty, persistent, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][1][1][0].nr, + bats[1][1][1][1][0].vmsz, + humansize(bats[1][1][1][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][1][1][0].sz, + humansize(bats[1][1][1][1][0].sz, mbuf, sizeof(mbuf))); if (bats[1][1][1][0][1].nr > 0) - printf("fix, dirty, persistent, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][1][1][0][1].nr, bats[1][1][1][0][1].vmsz, bats[1][1][1][0][1].sz); + printf("fix, dirty, persistent, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][1][0][1].nr, + bats[1][1][1][0][1].vmsz, + humansize(bats[1][1][1][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][1][0][1].sz, + humansize(bats[1][1][1][0][1].sz, mbuf, sizeof(mbuf))); if (bats[1][1][1][0][0].nr > 0) - printf("fix, dirty, persistent, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][1][1][0][0].nr, bats[1][1][1][0][0].vmsz, bats[1][1][1][0][0].sz); + printf("fix, dirty, persistent, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][1][0][0].nr, + bats[1][1][1][0][0].vmsz, + humansize(bats[1][1][1][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][1][0][0].sz, + humansize(bats[1][1][1][0][0].sz, mbuf, sizeof(mbuf))); if (bats[1][1][0][1][1].nr > 0) - printf("fix, dirty, transient, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][1][0][1][1].nr, bats[1][1][0][1][1].vmsz, bats[1][1][0][1][1].sz); + printf("fix, dirty, transient, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][0][1][1].nr, + bats[1][1][0][1][1].vmsz, + humansize(bats[1][1][0][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][0][1][1].sz, + humansize(bats[1][1][0][1][1].sz, mbuf, sizeof(mbuf))); if (bats[1][1][0][1][0].nr > 0) - printf("fix, dirty, transient, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][1][0][1][0].nr, bats[1][1][0][1][0].vmsz, bats[1][1][0][1][0].sz); + printf("fix, dirty, transient, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][0][1][0].nr, + bats[1][1][0][1][0].vmsz, + humansize(bats[1][1][0][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][0][1][0].sz, + humansize(bats[1][1][0][1][0].sz, mbuf, sizeof(mbuf))); if (bats[1][1][0][0][1].nr > 0) - printf("fix, dirty, transient, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][1][0][0][1].nr, bats[1][1][0][0][1].vmsz, bats[1][1][0][0][1].sz); + printf("fix, dirty, transient, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][0][0][1].nr, + bats[1][1][0][0][1].vmsz, + humansize(bats[1][1][0][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][0][0][1].sz, + humansize(bats[1][1][0][0][1].sz, mbuf, sizeof(mbuf))); if (bats[1][1][0][0][0].nr > 0) - printf("fix, dirty, transient, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][1][0][0][0].nr, bats[1][1][0][0][0].vmsz, bats[1][1][0][0][0].sz); + printf("fix, dirty, transient, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][1][0][0][0].nr, + bats[1][1][0][0][0].vmsz, + humansize(bats[1][1][0][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][1][0][0][0].sz, + humansize(bats[1][1][0][0][0].sz, mbuf, sizeof(mbuf))); if (bats[1][0][1][1][1].nr > 0) - printf("fix, clean, persistent, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][0][1][1][1].nr, bats[1][0][1][1][1].vmsz, bats[1][0][1][1][1].sz); + printf("fix, clean, persistent, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][1][1][1].nr, + bats[1][0][1][1][1].vmsz, + humansize(bats[1][0][1][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][1][1][1].sz, + humansize(bats[1][0][1][1][1].sz, mbuf, sizeof(mbuf))); if (bats[1][0][1][1][0].nr > 0) - printf("fix, clean, persistent, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][0][1][1][0].nr, bats[1][0][1][1][0].vmsz, bats[1][0][1][1][0].sz); + printf("fix, clean, persistent, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][1][1][0].nr, + bats[1][0][1][1][0].vmsz, + humansize(bats[1][0][1][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][1][1][0].sz, + humansize(bats[1][0][1][1][0].sz, mbuf, sizeof(mbuf))); if (bats[1][0][1][0][1].nr > 0) - printf("fix, clean, persistent, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][0][1][0][1].nr, bats[1][0][1][0][1].vmsz, bats[1][0][1][0][1].sz); + printf("fix, clean, persistent, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][1][0][1].nr, + bats[1][0][1][0][1].vmsz, + humansize(bats[1][0][1][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][1][0][1].sz, + humansize(bats[1][0][1][0][1].sz, mbuf, sizeof(mbuf))); if (bats[1][0][1][0][0].nr > 0) - printf("fix, clean, persistent, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][0][1][0][0].nr, bats[1][0][1][0][0].vmsz, bats[1][0][1][0][0].sz); + printf("fix, clean, persistent, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][1][0][0].nr, + bats[1][0][1][0][0].vmsz, + humansize(bats[1][0][1][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][1][0][0].sz, + humansize(bats[1][0][1][0][0].sz, mbuf, sizeof(mbuf))); if (bats[1][0][0][1][1].nr > 0) - printf("fix, clean, transient, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][0][0][1][1].nr, bats[1][0][0][1][1].vmsz, bats[1][0][0][1][1].sz); + printf("fix, clean, transient, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][0][1][1].nr, + bats[1][0][0][1][1].vmsz, + humansize(bats[1][0][0][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][0][1][1].sz, + humansize(bats[1][0][0][1][1].sz, mbuf, sizeof(mbuf))); if (bats[1][0][0][1][0].nr > 0) - printf("fix, clean, transient, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[1][0][0][1][0].nr, bats[1][0][0][1][0].vmsz, bats[1][0][0][1][0].sz); + printf("fix, clean, transient, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][0][1][0].nr, + bats[1][0][0][1][0].vmsz, + humansize(bats[1][0][0][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][0][1][0].sz, + humansize(bats[1][0][0][1][0].sz, mbuf, sizeof(mbuf))); if (bats[1][0][0][0][1].nr > 0) - printf("fix, clean, transient, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][0][0][0][1].nr, bats[1][0][0][0][1].vmsz, bats[1][0][0][0][1].sz); + printf("fix, clean, transient, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][0][0][1].nr, + bats[1][0][0][0][1].vmsz, + humansize(bats[1][0][0][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][0][0][1].sz, + humansize(bats[1][0][0][0][1].sz, mbuf, sizeof(mbuf))); if (bats[1][0][0][0][0].nr > 0) - printf("fix, clean, transient, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[1][0][0][0][0].nr, bats[1][0][0][0][0].vmsz, bats[1][0][0][0][0].sz); + printf("fix, clean, transient, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[1][0][0][0][0].nr, + bats[1][0][0][0][0].vmsz, + humansize(bats[1][0][0][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[1][0][0][0][0].sz, + humansize(bats[1][0][0][0][0].sz, mbuf, sizeof(mbuf))); if (bats[0][1][1][1][1].nr > 0) - printf("no fix, dirty, persistent, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][1][1][1][1].nr, bats[0][1][1][1][1].vmsz, bats[0][1][1][1][1].sz); + printf("no fix, dirty, persistent, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][1][1][1].nr, + bats[0][1][1][1][1].vmsz, + humansize(bats[0][1][1][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][1][1][1].sz, + humansize(bats[0][1][1][1][1].sz, mbuf, sizeof(mbuf))); if (bats[0][1][1][1][0].nr > 0) - printf("no fix, dirty, persistent, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][1][1][1][0].nr, bats[0][1][1][1][0].vmsz, bats[0][1][1][1][0].sz); + printf("no fix, dirty, persistent, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][1][1][0].nr, + bats[0][1][1][1][0].vmsz, + humansize(bats[0][1][1][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][1][1][0].sz, + humansize(bats[0][1][1][1][0].sz, mbuf, sizeof(mbuf))); if (bats[0][1][1][0][1].nr > 0) - printf("no fix, dirty, persistent, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][1][1][0][1].nr, bats[0][1][1][0][1].vmsz, bats[0][1][1][0][1].sz); + printf("no fix, dirty, persistent, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][1][0][1].nr, + bats[0][1][1][0][1].vmsz, + humansize(bats[0][1][1][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][1][0][1].sz, + humansize(bats[0][1][1][0][1].sz, mbuf, sizeof(mbuf))); if (bats[0][1][1][0][0].nr > 0) - printf("no fix, dirty, persistent, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][1][1][0][0].nr, bats[0][1][1][0][0].vmsz, bats[0][1][1][0][0].sz); + printf("no fix, dirty, persistent, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][1][0][0].nr, + bats[0][1][1][0][0].vmsz, + humansize(bats[0][1][1][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][1][0][0].sz, + humansize(bats[0][1][1][0][0].sz, mbuf, sizeof(mbuf))); if (bats[0][1][0][1][1].nr > 0) - printf("no fix, dirty, transient, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][1][0][1][1].nr, bats[0][1][0][1][1].vmsz, bats[0][1][0][1][1].sz); + printf("no fix, dirty, transient, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][0][1][1].nr, + bats[0][1][0][1][1].vmsz, + humansize(bats[0][1][0][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][0][1][1].sz, + humansize(bats[0][1][0][1][1].sz, mbuf, sizeof(mbuf))); if (bats[0][1][0][1][0].nr > 0) - printf("no fix, dirty, transient, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][1][0][1][0].nr, bats[0][1][0][1][0].vmsz, bats[0][1][0][1][0].sz); + printf("no fix, dirty, transient, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][0][1][0].nr, + bats[0][1][0][1][0].vmsz, + humansize(bats[0][1][0][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][0][1][0].sz, + humansize(bats[0][1][0][1][0].sz, mbuf, sizeof(mbuf))); if (bats[0][1][0][0][1].nr > 0) - printf("no fix, dirty, transient, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][1][0][0][1].nr, bats[0][1][0][0][1].vmsz, bats[0][1][0][0][1].sz); + printf("no fix, dirty, transient, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][0][0][1].nr, + bats[0][1][0][0][1].vmsz, + humansize(bats[0][1][0][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][0][0][1].sz, + humansize(bats[0][1][0][0][1].sz, mbuf, sizeof(mbuf))); if (bats[0][1][0][0][0].nr > 0) - printf("no fix, dirty, transient, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][1][0][0][0].nr, bats[0][1][0][0][0].vmsz, bats[0][1][0][0][0].sz); + printf("no fix, dirty, transient, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][1][0][0][0].nr, + bats[0][1][0][0][0].vmsz, + humansize(bats[0][1][0][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][1][0][0][0].sz, + humansize(bats[0][1][0][0][0].sz, mbuf, sizeof(mbuf))); if (bats[0][0][1][1][1].nr > 0) - printf("no fix, clean, persistent, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][0][1][1][1].nr, bats[0][0][1][1][1].vmsz, bats[0][0][1][1][1].sz); + printf("no fix, clean, persistent, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][1][1][1].nr, + bats[0][0][1][1][1].vmsz, + humansize(bats[0][0][1][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][1][1][1].sz, + humansize(bats[0][0][1][1][1].sz, mbuf, sizeof(mbuf))); if (bats[0][0][1][1][0].nr > 0) - printf("no fix, clean, persistent, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][0][1][1][0].nr, bats[0][0][1][1][0].vmsz, bats[0][0][1][1][0].sz); + printf("no fix, clean, persistent, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][1][1][0].nr, + bats[0][0][1][1][0].vmsz, + humansize(bats[0][0][1][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][1][1][0].sz, + humansize(bats[0][0][1][1][0].sz, mbuf, sizeof(mbuf))); if (bats[0][0][1][0][1].nr > 0) - printf("no fix, clean, persistent, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][0][1][0][1].nr, bats[0][0][1][0][1].vmsz, bats[0][0][1][0][1].sz); + printf("no fix, clean, persistent, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][1][0][1].nr, + bats[0][0][1][0][1].vmsz, + humansize(bats[0][0][1][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][1][0][1].sz, + humansize(bats[0][0][1][0][1].sz, mbuf, sizeof(mbuf))); if (bats[0][0][1][0][0].nr > 0) - printf("no fix, clean, persistent, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][0][1][0][0].nr, bats[0][0][1][0][0].vmsz, bats[0][0][1][0][0].sz); + printf("no fix, clean, persistent, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][1][0][0].nr, + bats[0][0][1][0][0].vmsz, + humansize(bats[0][0][1][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][1][0][0].sz, + humansize(bats[0][0][1][0][0].sz, mbuf, sizeof(mbuf))); if (bats[0][0][0][1][1].nr > 0) - printf("no fix, clean, transient, loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][0][0][1][1].nr, bats[0][0][0][1][1].vmsz, bats[0][0][0][1][1].sz); + printf("no fix, clean, transient, loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][0][1][1].nr, + bats[0][0][0][1][1].vmsz, + humansize(bats[0][0][0][1][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][0][1][1].sz, + humansize(bats[0][0][0][1][1].sz, mbuf, sizeof(mbuf))); if (bats[0][0][0][1][0].nr > 0) - printf("no fix, clean, transient, not loaded, hot: %d bats, %zu virtual, %zu malloc\n", bats[0][0][0][1][0].nr, bats[0][0][0][1][0].vmsz, bats[0][0][0][1][0].sz); + printf("no fix, clean, transient, not loaded, hot: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][0][1][0].nr, + bats[0][0][0][1][0].vmsz, + humansize(bats[0][0][0][1][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][0][1][0].sz, + humansize(bats[0][0][0][1][0].sz, mbuf, sizeof(mbuf))); if (bats[0][0][0][0][1].nr > 0) - printf("no fix, clean, transient, loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][0][0][0][1].nr, bats[0][0][0][0][1].vmsz, bats[0][0][0][0][1].sz); + printf("no fix, clean, transient, loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][0][0][1].nr, + bats[0][0][0][0][1].vmsz, + humansize(bats[0][0][0][0][1].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][0][0][1].sz, + humansize(bats[0][0][0][0][1].sz, mbuf, sizeof(mbuf))); if (bats[0][0][0][0][0].nr > 0) - printf("no fix, clean, transient, not loaded, cold: %d bats, %zu virtual, %zu malloc\n", bats[0][0][0][0][0].nr, bats[0][0][0][0][0].vmsz, bats[0][0][0][0][0].sz); + printf("no fix, clean, transient, not loaded, cold: %d bats, %zu%s virtual, %zu%s malloc\n", + bats[0][0][0][0][0].nr, + bats[0][0][0][0][0].vmsz, + humansize(bats[0][0][0][0][0].vmsz, vbuf, sizeof(vbuf)), + bats[0][0][0][0][0].sz, + humansize(bats[0][0][0][0][0].sz, mbuf, sizeof(mbuf))); printf("%d bats total, %d in use, %"PRIu32" free bats in common shared list\n", sz - 1, nbats, nfree); diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -215,6 +215,8 @@ void HEAP_recover(Heap *, const var_t *, gdk_return HEAPsave(Heap *h, const char *nme, const char *ext, bool dosync, BUN free, MT_Lock *lock) __attribute__((__warn_unused_result__)) __attribute__((__visibility__("hidden"))); +char *humansize(size_t val, char *buf, size_t buflen) + __attribute__((__visibility__("hidden"))); double joincost(BAT *r, BUN lcount, struct canditer *rci, bool *hash, bool *phash, bool *cand) __attribute__((__visibility__("hidden"))); void STRMPincref(Strimps *strimps) diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -2016,6 +2016,22 @@ GDKprintinforegister(void (*func)(void)) *pp = p; } +char * +humansize(size_t val, char *buf, size_t buflen) +{ _______________________________________________ checkin-list mailing list -- [email protected] To unsubscribe send an email to [email protected]
