freebsd-dev/usr.sbin/named/storage.c
1995-05-30 03:57:47 +00:00

206 lines
5.7 KiB
C

/*
* ++Copyright++ 1985, 1989
* -
* Copyright (c) 1985, 1989
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#include <sys/param.h>
#include <syslog.h>
#ifdef DSTORAGE
/*
* S T O R A G E . C
*
* Ray Tracing program, storage manager.
*
* Functions -
* rt_malloc Allocate storage, with visibility & checking
* rt_free Similarly, free storage
* rt_prmem When debugging, print memory map
* calloc, cfree Which call rt_malloc, rt_free
*
* Author -
* Michael John Muuss
*
* Source -
* SECAD/VLD Computing Consortium, Bldg 394
* The U. S. Army Ballistic Research Laboratory
* Aberdeen Proving Ground, Maryland 21005-5066
*
* Copyright Notice -
* This software is Copyright (C) 1987 by the United States Army.
* All rights reserved.
*/
#ifndef lint
static char RCSid[] = "$Id: storage.c,v 1.2 1994/09/22 20:45:09 pst Exp $";
#endif
#undef malloc
#undef free
#define MDB_SIZE 20000
#define MDB_MAGIC 0x12348969
struct memdebug {
char *mdb_addr;
char *mdb_str;
int mdb_len;
} rt_mdb[MDB_SIZE];
/*
* R T _ M A L L O C
*/
char *
rt_malloc(cnt)
unsigned int cnt;
{
register char *ptr;
cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1));
ptr = malloc(cnt);
if( ptr==(char *)0 ) {
syslog(LOG_ERR, "rt_malloc: malloc failure");
abort();
} else {
register struct memdebug *mp = rt_mdb;
for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
if( mp->mdb_len > 0 ) continue;
mp->mdb_addr = ptr;
mp->mdb_len = cnt;
mp->mdb_str = "???";
goto ok;
}
syslog(LOG_ERR, "rt_malloc: memdebug overflow\n");
}
ok: ;
{
register int *ip = (int *)(ptr+cnt-sizeof(int));
*ip = MDB_MAGIC;
}
return(ptr);
}
/*
* R T _ F R E E
*/
void
rt_free(ptr)
char *ptr;
{
register struct memdebug *mp = rt_mdb;
for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
if( mp->mdb_len <= 0 ) continue;
if( mp->mdb_addr != ptr ) continue;
{
register int *ip = (int *)(ptr+mp->mdb_len-sizeof(int));
if( *ip != MDB_MAGIC ) {
syslog(LOG_ERR, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr, "???", *ip, MDB_MAGIC);
abort();
}
}
mp->mdb_len = 0; /* successful free */
goto ok;
}
syslog(LOG_ERR, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr, "???");
abort();
ok: ;
*((int *)ptr) = -1; /* zappo! */
free(ptr);
}
/*
* R T _ P R M E M
*
* Print map of memory currently in use.
*/
void
rt_prmem(str)
char *str;
{
register struct memdebug *mp = rt_mdb;
register int *ip;
printf("\nRT memory use\t\t%s\n", str);
for( ; mp < &rt_mdb[MDB_SIZE]; mp++ ) {
if( mp->mdb_len <= 0 ) continue;
ip = (int *)(mp->mdb_addr+mp->mdb_len-sizeof(int));
printf("%7x %5x %s %s\n",
mp->mdb_addr, mp->mdb_len, mp->mdb_str,
*ip!=MDB_MAGIC ? "-BAD-" : "" );
if( *ip != MDB_MAGIC )
printf("\t%x\t%x\n", *ip, MDB_MAGIC);
}
}
char *
calloc(num, size)
register unsigned num, size;
{
register char *p;
size *= num;
if (p = rt_malloc(size))
bzero(p, size);
return (p);
}
cfree(p, num, size)
char *p;
unsigned num;
unsigned size;
{
rt_free(p);
}
#endif /*DSTORAGE*/