aboutsummaryrefslogtreecommitdiffstats
path: root/awk.h
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2019-08-30 10:42:50 -0400
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2019-08-30 10:42:50 -0400
commit8cc45af919dc56011dbf4c8965b9c1e4784e56d7 (patch)
treee271f42fbc3de7ce1f1e477e700d769bde2fcca4 /awk.h
parentc15d2db3ce7ea49741d8792190f9212842db86ec (diff)
downloadegawk-8cc45af919dc56011dbf4c8965b9c1e4784e56d7.tar.gz
egawk-8cc45af919dc56011dbf4c8965b9c1e4784e56d7.tar.bz2
egawk-8cc45af919dc56011dbf4c8965b9c1e4784e56d7.zip
In .developing mode, define MEMDEBUG to use malloc/free for block allocation to facilitate finding memory leaks.
Diffstat (limited to 'awk.h')
-rw-r--r--awk.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/awk.h b/awk.h
index 363e4403..345d87b3 100644
--- a/awk.h
+++ b/awk.h
@@ -1061,6 +1061,9 @@ struct block_item {
struct block_header {
struct block_item *freep;
size_t size;
+#ifdef MEMDEBUG
+ long cnt;
+#endif
};
enum block_id {
@@ -1323,12 +1326,23 @@ DEREF(NODE *r)
#define get_lhs(n, r) (n)->type == Node_var && ! var_uninitialized(n) ? \
&((n)->var_value) : r_get_lhs((n), (r))
+#ifdef MEMDEBUG
+
+extern void *r_getblock(int id);
+extern void r_freeblock(void *, int id);
+#define getblock(p, id, ty) (void) (p = r_getblock(id))
+#define freeblock(p, id) (void) (r_freeblock(p, id))
+
+#else /* MEMDEBUG */
+
#define getblock(p, id, ty) (void) ((p = (ty) nextfree[id].freep) ? \
(ty) (nextfree[id].freep = ((struct block_item *) p)->freep) \
: (p = (ty) more_blocks(id)))
#define freeblock(p, id) (void) (((struct block_item *) p)->freep = nextfree[id].freep, \
nextfree[id].freep = (struct block_item *) p)
+#endif /* MEMDEBUG */
+
#define getnode(n) getblock(n, BLOCK_NODE, NODE *)
#define freenode(n) freeblock(n, BLOCK_NODE)