{
sdbm_rewind(d);
gdbm_close(d->db);
- free(d);
+ xfree(d);
}
static int
if (!V.dptr)
return 0;
rc = sdbm_put_user(V.dptr, V.dsize, val, vallen);
- free(V.dptr);
+ xfree(V.dptr);
return rc ? SDBM_ERROR_TOO_LARGE : 1;
}
{
if (d->prevkey.dptr)
{
- free(d->prevkey.dptr);
+ xfree(d->prevkey.dptr);
d->prevkey.dptr = NULL;
}
}
if (d->prevkey.dptr)
{
K = gdbm_nextkey(d->db, d->prevkey);
- free(d->prevkey.dptr);
+ xfree(d->prevkey.dptr);
}
else
K = gdbm_firstkey(d->db);
/* Allocation */
-void *xmalloc(uns);
-void *xrealloc(void *, uns);
+#ifdef DMALLOC
+/*
+ * The standard dmalloc macros tend to produce lots of namespace
+ * conflicts and we use only xmalloc and xfree, so we can define
+ * the stubs ourselves.
+ */
+#define DMALLOC_DISABLE
+#include <dmalloc.h>
+#define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size)
+#define xrealloc(ptr,size) _xrealloc_leap(__FILE__, __LINE__, ptr, size)
+#define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr)
+#else
+/*
+ * Unfortunately, several libraries we might want to link to define
+ * their own xmalloc and we don't want to interfere with them, hence
+ * the renaming.
+ */
+#define xmalloc bird_xmalloc
+void *xmalloc(unsigned);
+void *xrealloc(void *, unsigned);
+#define xfree(x) free(x)
+#endif
+
byte *stralloc(byte *);
/* Content-Type pattern matching and filters */
ASSERT(EMPTY_LIST(c->locked_pages));
ASSERT(EMPTY_LIST(c->dirty_pages));
ASSERT(EMPTY_LIST(c->free_pages));
- free(c->hash_table);
- free(c);
+ xfree(c->hash_table);
+ xfree(c);
}
static void
rem_node(&p->hn);
c->free_count--;
c->total_count--;
- free(p);
+ xfree(p);
}
ASSERT(!c->free_count);
}
for(d=p->first; d; d = c)
{
c = d->next;
- free(d);
+ xfree(d);
}
for(d=p->first_large; d; d = c)
{
c = d->next;
- free(d);
+ xfree(d);
}
- free(p);
+ xfree(p);
}
void
while (c = p->first_large)
{
p->first_large = c->next;
- free(c);
+ xfree(c);
}
}