This is slmalloc.c in view mode; [Download] [Up]
/* Copyright (c) 1992, 1995 John E. Davis
* All rights reserved.
*
* You may distribute under the terms of either the GNU General Public
* License or the Perl Artistic License.
*/
#include "config.h"
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef SL_MALLOC_DEBUG
# undef SL_MALLOC_DEBUG
#endif
#include "slang.h"
#ifdef __alpha
# define Chunk 8
#else
# define Chunk 4
#endif
static long Total_Allocated;
static long Max_Single_Allocation;
static long Max_Allocated;
/* #define SLDEBUG_DOUT */
#ifdef SLDEBUG_DOUT
static FILE *dout;
#endif
void SLmalloc_dump_statistics (void)
{
#ifdef SLDEBUG_DOUT
fflush (dout);
#endif
fprintf (stderr, "Total Allocated: %ld\nHighest single allocation: %ld\nHighest Total Allocated:%ld\n",
Total_Allocated, Max_Single_Allocation, Max_Allocated);
}
static void fixup (unsigned char *p, unsigned long n, char *what)
{
#ifdef SLDEBUG_DOUT
if (dout == NULL) dout = fopen ("malloc.out", "w");
#endif
p += Chunk;
*(p - 4)= (unsigned char) ((n >> 24) & 0xFF);
*(p - 3) = (unsigned char) ((n >> 16) & 0xFF);
*(p - 2) = (unsigned char) ((n >> 8) & 0xFF);
*(p - 1) = (unsigned char) (n & 0xFF);
*(p + (int) n) = 27;
*(p + (int) (n + 1)) = 182;
*(p + (int) (n + 2)) = 81;
*(p + (int) (n + 3)) = 86;
Total_Allocated += (long) n;
if (Total_Allocated > Max_Allocated) Max_Allocated = Total_Allocated;
if ((long) n > Max_Single_Allocation) Max_Single_Allocation = (long) n;
#ifdef SLDEBUG_DOUT
fprintf (dout, "ALLOC: %s\t%p %ld\n", what, p, (long) n);
#else
#ifdef pc_system
(void) what;
#endif
#endif
}
static void SLmalloc_doerror (char *buf)
{
SLang_doerror (buf);
}
static int check_memory (unsigned char *p, char *what)
{
char buf[100];
unsigned long n;
n = ((unsigned long) *(p - 4)) << 24;
n |= ((unsigned long) *(p - 3)) << 16;
n |= ((unsigned long) *(p - 2)) << 8;
n |= (unsigned long) *(p - 1);
*(p - 4) = *(p - 3) = *(p - 2) = *(p - 1) = 0xFF;
if (n == 0xFFFFFFFFU)
{
sprintf (buf, "%s: %p: Already FREE! Abort NOW.", what, p - Chunk);
SLmalloc_doerror (buf);
return 0;
}
if ((*(p + (int) n) != 27)
|| (*(p + (int) (n + 1)) != 182)
|| (*(p + (int) (n + 2)) != 81)
|| (*(p + (int) (n + 3)) != 86))
{
sprintf (buf, "\007%s: %p: Memory corrupt! Abort NOW.", what, p);
SLmalloc_doerror (buf);
return 0;
}
Total_Allocated -= (long) n;
if (Total_Allocated < 0)
{
sprintf (buf, "\007%s: %p\nFreed %ld, Allocated is: %ld!\n",
what, p, (long) n, Total_Allocated);
SLang_doerror (buf);
}
#ifdef SLDEBUG_DOUT
fprintf (dout, "FREE: %s:\t%p %ld\n", what, p, (long) n);
#endif
return 1;
}
void SLdebug_free (unsigned char *p)
{
if (!check_memory ((unsigned char *) p, "FREE")) return;
SLFREE (p - Chunk);
}
unsigned char *SLdebug_malloc (unsigned long n)
{
unsigned char *p;
if ((p = (unsigned char *) SLMALLOC (n + 2 * Chunk)) == NULL) return NULL;
fixup ((unsigned char *) p, n, "MALLOC");
return p + Chunk;
}
unsigned char *SLdebug_realloc (unsigned char *p, unsigned long n)
{
if (!check_memory ((unsigned char *) p, "REALLOC")) return NULL;
if ((p = (unsigned char *) SLREALLOC (p - Chunk, n + 2 * Chunk)) == NULL) return NULL;
fixup ((unsigned char *) p, n, "REALLOC");
return p + Chunk;
}
unsigned char *SLdebug_calloc (unsigned long n, unsigned long size)
{
unsigned char *p;
int m;
/* This is tough -- hope this is a good assumption!! */
if (size >= Chunk) m = 1; else m = Chunk;
if ((p = (unsigned char *) SLCALLOC (n + m + m, size)) == NULL) return NULL;
fixup ((unsigned char *) p, size * n, "CALLOC");
return p + Chunk;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.