16 #define REALLOC_MAX 2000
27 mem_init(
unsigned char *ptr,
unsigned long size)
32 for(i=0; i<size; i+=2047) {
33 j = (
unsigned long)ptr ^ i;
34 ptr[i] = ((j ^ (j>>8)) & 0xFF);
36 j = (
unsigned long)ptr ^ (size-1);
37 ptr[size-1] = ((j ^ (j>>8)) & 0xFF);
41 mem_check(
unsigned char *ptr,
unsigned long size)
45 if(size == 0)
return 0;
46 for(i=0; i<size; i+=2047) {
47 j = (
unsigned long)ptr ^ i;
48 if(ptr[i] != ((j ^ (j>>8)) & 0xFF))
return 1;
50 j = (
unsigned long)ptr ^ (size-1);
51 if(ptr[size-1] != ((j ^ (j>>8)) & 0xFF))
return 2;
56 zero_check(
unsigned* ptr,
unsigned long size)
60 while(size >=
sizeof(*ptr)) {
65 ptr2 = (
unsigned char*)ptr;
80 bin_alloc(
struct bin *m,
unsigned long size,
int r)
83 if(mem_check(m->ptr, m->size)) {
84 printf(
"memory corrupt!\n");
91 if(m->size > 0) free(m->ptr);
92 m->ptr = (
unsigned char *)memalign(
sizeof(
int) << r, size);
94 if(m->size > 0) free(m->ptr);
95 m->ptr = (
unsigned char *)calloc(size, 1);
97 if(zero_check((
unsigned*)m->ptr, size)) {
102 printf(
"calloc'ed memory non-zero (ptr=%p, i=%ld)!\n", m->ptr, i);
106 }
else if(r < 100 && m->size < REALLOC_MAX) {
107 if(m->size == 0) m->ptr = NULL;
108 m->ptr = realloc(m->ptr, size);
110 if(m->size > 0) free(m->ptr);
111 m->ptr = (
unsigned char *)malloc(size);
114 printf(
"out of memory (r=%d, size=%ld)!\n", r, (
long)size);
119 mem_init(m->ptr, m->size);
126 bin_free(
struct bin *m)
128 if(m->size == 0)
return;
130 if(mem_check(m->ptr, m->size)) {
131 printf(
"memory corrupt!\n");