4 * Revision 1.2 2001/04/05 16:59:11 stegerg
5 * AROS does not have an <malloc.h> include. BTW: Should it?
7 * Revision 1.1 2001/04/04 05:43:38 wang
8 * First commit: compiles on Linux, Amiga, Windows, Windows CE, generic gcc
10 * Revision 1.3 1999/11/26 14:30:27 bnv
11 * Added: A dummy int, at Memory structure for 8-byte alignment on 32-bit machines
13 * Revision 1.2 1999/11/26 13:13:47 bnv
14 * Changed: Added MAGIC number also to the end.
15 * Chanted: Modified to work with 64-bit computers.
17 * Revision 1.1 1998/07/02 17:34:50 bnv
33 #define MAGIC 0x12346789L
36 * This file provides some debugging functions for memory allocation
39 typedef struct tmemory_st
{
43 struct tmemory_st
*next
;
44 struct tmemory_st
*prev
;
45 #if defined(ALIGN) && !defined(__ALPHA)
46 /* Some machines have problems ithe address is not at 8-bytes aligned */
49 byte data
[sizeof(void*)];
52 static Memory
*mem_head
= NULL
;
53 static long total_mem
= 0L;
57 /* -------------- mem_malloc ---------------- */
59 mem_malloc(size_t size
, char *desc
)
63 /* add space for the header */
64 #if defined(__BORLANDC__)&&(defined(__HUGE__)||defined(__LARGE__))
65 mem
= (Memory
*)farmalloc(sizeof(Memory
)+size
);
67 mem
= (Memory
*)malloc(sizeof(Memory
)+size
);
70 /* Create the memory header */
82 /* Mark also the END of data */
83 *(dword
*)((byte
*)mem
->data
+mem
->size
) = MAGIC
;
85 return (void *)(mem
->data
);
90 /* -------------- mem_realloc ---------------- */
92 mem_realloc(void *ptr
, size_t size
)
98 mem
= (Memory
*)((char *)ptr
- (sizeof(Memory
)-sizeof(void*)));
100 /* check if the memory is valid */
101 if (mem
->magic
!= MAGIC
) {
102 fprintf(STDERR
,"mem_realloc: object is not allocated size=%d!\n",(int)size
);
107 if (*(dword
*)(mem
->data
+mem
->size
) != MAGIC
) {
108 fprintf(STDERR
,"mem_realloc: End magic number doesn't match!\n");
113 total_mem
-= mem
->size
;
114 head
= (mem
==mem_head
);
116 #if defined(__BORLANDC__)&&(defined(__HUGE__)||defined(__LARGE__))
117 mem
= (Memory
*)farrealloc(mem
,size
+sizeof(Memory
));
119 mem
= (Memory
*)realloc(mem
,size
+sizeof(Memory
));
122 if (head
) mem_head
= mem
;
127 if (other
) other
->next
= mem
;
129 if (other
) other
->prev
= mem
;
131 /* Mark also the new END of data */
132 *(dword
*)(mem
->data
+mem
->size
) = MAGIC
;
134 return (void *)(mem
->data
);
137 /* -------------- mem_free ---------------- */
141 Memory
*mem
, *mem_prev
, *mem_next
;
144 /* find our header */
145 mem
= (Memory
*)((char *)ptr
- (sizeof(Memory
)-sizeof(void*)));
147 if (mem
->magic
!= MAGIC
) {
148 fprintf(STDERR
,"mem_free: object %p is not allocated!\n",ptr
);
152 if (*(dword
*)(mem
->data
+mem
->size
) != MAGIC
) {
153 fprintf(STDERR
,"mem_realloc: End magic number doesn't match!\n");
158 /* Remove the MAGIC number, just to catch invalid entries */
161 mem_prev
= mem
->prev
;
162 mem_next
= mem
->next
;
163 total_mem
-= mem
->size
;
164 head
= (mem
==mem_head
);
166 #if defined(__BORLANDC__)&&(defined(__HUGE__)||defined(__LARGE__))
172 if (mem_next
) mem_next
->prev
= mem_prev
;
173 if (mem_prev
) mem_prev
->next
= mem_next
;
174 if (head
) mem_head
= mem_prev
;
178 /* -------------- mem_list ---------------- */
187 fprintf(STDERR
,"\nMemory list:\n");
190 fputs((mem
->magic
==MAGIC
)?" ":"??",STDERR
);
192 fprintf(STDERR
,"%3d %6d %s\t\"",
193 ++count
, (int)mem
->size
, mem
->desc
);
195 fprintf(STDERR
,"%c",mem
->data
[i
]);
196 fprintf(STDERR
,"\" ");
198 fprintf(STDERR
,"%02X ",mem
->data
[i
]);
199 fprintf(STDERR
,"\n");
202 if (getchar()=='q') exit(0);
206 fprintf(STDERR
,"\n");
209 /* --------------- memchk_list ------------------- */
216 for (mem
=mem_head
; mem
; mem
= mem
->prev
,i
++) {
217 if (mem
->magic
!= MAGIC
) {
218 fprintf(STDERR
,"Magic number destroyed! ID=%d\n",i
);
221 if (*(dword
*)(mem
->data
+mem
->size
) != MAGIC
) {
222 fprintf(STDERR
,"mem_realloc: End magic number doesn't match! ID=%d\n",i
);
229 /* -------------- mem_allocated ----------------- */
231 mem_allocated( void )
234 } /* mem_allocated */