summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfmx/src/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/mem.c')
-rw-r--r--Build/source/texk/dvipdfmx/src/mem.c158
1 files changed, 133 insertions, 25 deletions
diff --git a/Build/source/texk/dvipdfmx/src/mem.c b/Build/source/texk/dvipdfmx/src/mem.c
index 382f0dd8e81..ecc42c6321c 100644
--- a/Build/source/texk/dvipdfmx/src/mem.c
+++ b/Build/source/texk/dvipdfmx/src/mem.c
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/dvipdfmx/src/mem.c,v 1.3 2002/10/30 02:27:11 chofchof Exp $
+/* $Header: /home/cvsroot/dvipdfmx/src/mem.c,v 1.4 2007/11/14 03:36:01 chofchof Exp $
This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
@@ -25,24 +25,69 @@
#include <stdio.h>
#include <stdlib.h>
+#include "dpxutil.h"
#include "mem.h"
+static long int mem_count = 0;
+static int mem_internal = 0;
+static struct ht_table *mem_ht = NULL;
+
#ifdef MEM_DEBUG
-FILE *debugfile = NULL;
-static long int event = 0;
+
+#define MEM_LINE 128
+
+long int mem_event = 0;
+
+static void
+mem_noop (void *vp)
+{
+}
+
+static void
+mem_error (void *vp)
+{
+ fprintf(stderr, "pointer %p released, but not allocated\n", vp);
+}
+
#endif /* MEM_DEBUG */
-#ifdef MEM_DEBUG
-void mem_debug_init(void)
+void mem_debug_check(void)
{
- if (debugfile == NULL) {
- debugfile = fopen ("malloc.log", "w");
- fprintf (stderr, "*** Memory Debugging Log started ***\n");
+#ifdef MEM_DEBUG
+ struct ht_iter iter;
+
+ fprintf(stderr, "*** Memory still in use ***\n");
+
+ if (ht_set_iter(mem_ht, &iter) == 0) {
+ do {
+ int pl;
+ void *p = ht_iter_getkey(&iter, &pl);
+ char *s = ht_iter_getval(&iter);
+
+ fprintf(stderr, "%p %s\n", p, s);
+ } while (!ht_iter_next(&iter));
}
+ ht_clear_iter(&iter);
+
+ fprintf(stderr, "*** End of used memory ***\n");
+#endif /* MEM_DEBUG */
+
+ if (mem_count)
+ fprintf(stderr, "*** WARNING: %ld memory objects still allocated\n", mem_count);
}
+
+void mem_debug_init(void)
+{
+#ifdef MEM_DEBUG
+ mem_ht = malloc(sizeof(struct ht_table));
+ ht_init_table(mem_ht);
+ fprintf(stderr, "*** Memory debugging started ***\n");
+#else
+ mem_ht = (struct ht_table *) &mem_count; /* just any non-null value */
#endif /* MEM_DEBUG */
+}
-void *new (size_t size, char *function, int line)
+void *new (size_t size, const char *file, const char *function, int line)
{
void *result;
if ((result = malloc (size)) == NULL) {
@@ -51,44 +96,107 @@ void *new (size_t size, char *function, int line)
exit (1);
}
-#ifdef MEM_DEBUG
- mem_debug_init();
- event += 1;
- fprintf (debugfile, "%p %07ld [new] %s:%d\n", result, event, function, line);
+ if (!mem_internal) {
+ mem_count++;
+#ifdef MEM_DEBUG
+ mem_internal = 1;
+ char *s = malloc(MEM_LINE), **p = malloc(sizeof(result));
+ *p = result;
+ snprintf(s, MEM_LINE, "(0x%08lx) %s (%s, %d)"
+#ifdef __GNUC__
+ ", called from %p"
+#endif
+ , ++mem_event, function, file, line
+#ifdef __GNUC__
+ , __builtin_return_address(1)
+#endif
+ );
+ ht_insert_table(mem_ht, p, sizeof(result), s, mem_error);
+ mem_internal = 0;
#endif /* MEM_DEBUG */
+ }
return result;
}
-void *renew (void *mem, size_t size, char *function, int line)
+void *renew (void *mem, size_t size, const char *file, const char *function, int line)
{
void *result;
+
+ if (!mem_internal) {
+ if (!mem)
+ mem_count++;
#ifdef MEM_DEBUG
- mem_debug_init();
- event += 1;
- if (mem)
- fprintf (debugfile, "%p %07ld [fre] %s:%d\n", mem,
- event, function, line);
+ else {
+ mem_internal = 1;
+ if (!(mem_ht && ht_remove_table(mem_ht, &mem, sizeof(mem), mem_noop))) {
+ fprintf(stderr, "*** ERROR: Trying to re-allocate non-allocated memory\n");
+ fprintf(stderr, "%p %s (%s, %d)"
+#ifdef __GNUC__
+ ", called from %p"
+#endif
+ "\n", mem, function, file, line
+#ifdef __GNUC__
+ , __builtin_return_address(1)
+#endif
+ );
+ exit(1);
+ }
+ mem_internal = 0;
+ }
#endif /* MEM_DEBUG */
+ }
+
if ((result = realloc (mem, size)) == NULL) {
fprintf (stderr, "Out of memory!\n");
exit (1);
}
+
#ifdef MEM_DEBUG
- if (result)
- fprintf (debugfile, "%p %07ld [new] %s:%d\n", result, event, function, line);
+ if (!mem_internal) {
+ mem_internal = 1;
+ char *s = malloc(MEM_LINE), **p = malloc(sizeof(result));
+ *p = result;
+ snprintf(s, MEM_LINE, "(0x%08lx) %s (%s, %d)"
+#ifdef __GNUC__
+ ", called from %p"
+#endif
+ , ++mem_event, function, file, line
+#ifdef __GNUC__
+ , __builtin_return_address(1)
+#endif
+ );
+ ht_insert_table(mem_ht, p, sizeof(result), s, mem_error);
+ mem_internal = 0;
+ }
#endif /* MEM_DEBUG */
+
return result;
}
-void release (void *mem, char *function, int line)
+void release (void *mem, const char *file, const char *function, int line)
{
+ if (mem && !mem_internal) {
+ mem_count--;
#ifdef MEM_DEBUG
- mem_debug_init();
- event += 1;
- fprintf (debugfile, "%p %07ld [fre] %s:%d\n", mem, event, function, line);
+ mem_internal = 1;
+ if (!(mem_ht && ht_remove_table(mem_ht, &mem, sizeof(mem), mem_noop))) {
+ fprintf(stderr, "*** ERROR: Trying to free non-allocated memory\n");
+ fprintf(stderr, "%p %s (%s, %d)"
+#ifdef __GNUC__
+ ", called from %p"
+#endif
+ "\n", mem, function, file, line
+#ifdef __GNUC__
+ , __builtin_return_address(1)
+#endif
+ );
+ exit(1);
+ }
+ mem_internal = 0;
#endif /* MEM_DEBUG */
+ }
free (mem);
}