File:  [Research Unix] / researchv10no / cmd / cfront / ooptcfront / alloc.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

/* -*- Mode:C++ -*- */
/*ident	"@(#)ctrans:src/alloc.c	1.1.1.8" */
/*
	$Source: /var/lib/cvsd/repos/research/researchv10no/cmd/cfront/ooptcfront/alloc.c,v $ $RCSfile: alloc.c,v $
	$Revision: 1.1.1.1 $		$Date: 2018/04/24 17:21:35 $
	$Author: root $		$Locker:  $
	$State: Exp $


*/
/**************************************************************************

        C++ source for cfront, the C++ compiler front-end
        written in the computer science research center of Bell Labs

        Copyright (c) 1984 AT&T, Inc. All Rights Reserved
        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.

alloc.c:

*****************************************************************************/
#include "cfront.h"
#include <memory.h>
#include "size.h"

//int Nchunk;

//void print_free()
//{
//	fprintf(stderr,"free store: %d bytes alloc()=%d free()=%d\n",Nfree_store,Nal//loc, Nfree);
//	fprintf(stderr,"%d chunks: %d (%d)\n",Nchunk,CHUNK,Nchunk*CHUNK);
//}


/*
#ifdef __cplusplus
#include <new.h>
#define NEW_SIZE size_t
#else
#define NEW_SIZE long
#endif
*/

// now __HAVE_SIZE_T defined in 2.0 malloc.h c++ header file
#ifdef __HAVE_SIZE_T
#include <new.h>
#define NEW_SIZE size_t
#else
#define NEW_SIZE long
#endif

void* operator new(NEW_SIZE sz)	// get memory that might be freed
{
	char* p = calloc((unsigned)sz,1);

//fprintf(stderr,"alloc(%d)->%d\n",sz,p);
	if (p == 0) {			// no space
		free((char*)gtbl);	// get space for error message
//		if (Nspy) print_free();
		error('i',"free store exhausted");
	}
//	Nalloc++;
//	Nfree_store += sz+sizeof(int*);
	return p;
}
//int NFn, NFtn, NFbt, NFpv, NFf, NFe, NFs, NFc;

void operator delete (void* p)
{
	if (p == 0) return;

//fprintf(stderr,"free(%d) %d\n",p,((int*)p)[-1]-(int)p-1+sizeof(int*));

//if (Nspy) {
//	Pname pp = (Pname) p;
//	TOK t = pp->base;
//	Nfree++;
//	Nfree_store -= ((int*)p)[-1]-(int)p-1+sizeof(int*);
//	switch (t) {	// can be fooled by character strings
//	case INT: case CHAR: case TYPE: case VOID: case SHORT: case LONG:
//	case FLOAT: case DOUBLE: case LDOUBLE: case COBJ: case EOBJ: case FIELD:
//			NFbt++; break;
//
//	case PTR: case VEC:
//			NFpv++; break;
//
//	case FCT:	NFf++; break;
//
//	case ICON: case CCON: case STRING: case FCON: case THIS:
//			NFc++; break;
//	}
//}
	free((char*)p);
}

#ifdef OPTIMIZE
inline void mzero (register char * p, register int l)
{
    while(l>=0) { *p++ = 0; l--; }
}
#else
#define mzero(p,l) memset(p,0,l)
#endif

/* page chunking slows things down -- disimproved locality
   overwhelms cpu in malloc? */
#ifdef PageChunk
#define PAGESWORTH(sz) (8192/sizeof(sz))
#define PAGESIZE 8192
#endif

void *
expr::operator new (size_t)
{
    char * page;

    if(!free) {
#ifdef PageChunk
	Pexpr x;
	page = valloc(PAGESIZE);
	free = Pexpr(page);
	for(x = free; x < &free[PAGESWORTH(expr) - 1]; x++)
	    x->e1 = x+1;
	x->e1 = 0;
#else
	page = malloc(sizeof(expr));
	free = Pexpr(page);
	free->e1 = 0;
#endif
    }
    page = (char *)free;
    free = free->e1;
    mzero(page, sizeof(expr));
    return (void *)page;
}

void *
stmt::operator new (size_t)
{
    char * page;

    if(!free) {
#ifdef PageChunk
	Pstmt x;
	page = valloc(PAGESIZE);
	free = Pstmt(page);
	for(x = free; x < &free[PAGESWORTH(stmt) - 1]; x++)
	    x->s_list = x+1;
	x->s_list = 0;
#else
	page = malloc(sizeof(stmt));
	free = Pstmt(page);
	free->s_list = 0;
#endif
    }
    page = (char *)free;
    free = free->s_list;
    mzero(page, sizeof(stmt));
    return (void *) page;
}

void *
name::operator new (size_t)
{
    char * page;

    if(!free) {
#ifdef PageChunk
	Pname x;
	page = valloc(PAGESIZE);
	free = Pname(page);
	for(x = free; x < &free[PAGESWORTH(name) - 1]; x++)
	    x->n_tbl_list = x+1;
	x->n_tbl_list = 0;
#else
	page = malloc(sizeof(name));
	free = Pname(page);
	free->n_tbl_list = 0;
#endif
    }
    page = (char *)free;
    free = free->n_tbl_list;
    mzero(page, sizeof(name));
    return (void *) page;
}

void
expr::operator delete (void * ve)
{
    Pexpr(ve)->permanent = 3;
    Pexpr(ve)->e1 = new_free;
    new_free = Pexpr(ve);
}

void
stmt::operator delete (void * vs)
{
    Pstmt(vs)->permanent = 3;
    Pstmt(vs)->s_list = new_free;
    new_free = Pstmt(vs);
}

void
name::operator delete (void * vn)
{
    Pname(vn)->permanent = 3;
    Pname(vn)->n_tbl_list = new_free;
    new_free = Pname(vn);
}

void recycle_deleted_storage ()
{
    Pexpr fce;
    if(expr::free) {
	for (fce = expr::free;fce->e1;fce = fce->e1) ; /* just chase */
	fce->e1 = expr::new_free;
    } else expr::free = expr::new_free;
    expr::new_free = 0;

    Pstmt sce;
    if(stmt::free) {
	for (sce = stmt::free;sce->s_list;sce = sce->s_list) ; /* just chase */
	sce->s_list = stmt::new_free;
    } else stmt::free = stmt::new_free;
    stmt::new_free = 0;

    Pname nce;
    if(name::free) {
	for (nce = name::free;nce->n_tbl_list;nce = nce->n_tbl_list) ; /* just chase */
	nce->n_tbl_list = name::new_free;
    } else name::free = name::new_free;
    name::new_free = 0;
}

static char rcsinfo[] = "$Header: /var/lib/cvsd/repos/research/researchv10no/cmd/cfront/ooptcfront/alloc.c,v 1.1.1.1 2018/04/24 17:21:35 root Exp $";


/* $Log: alloc.c,v $
/* Revision 1.1.1.1  2018/04/24 17:21:35  root
/* researchv10 Norman
/*
 * Revision 1.1  89/11/20  08:50:09  benson
 * Initial revision
 * 
 * Revision 1.1  89/11/20  08:49:48  benson
 * Initial revision
 * 
 * Revision 1.1  89/11/20  08:49:25  benson
 * Initial revision
 * 
 * Revision 1.1  89/11/20  08:48:50  benson
 * Initial revision
 * 
 * Revision 1.6  89/10/05  11:37:40  benson
 * change free-list management. Deleted things aren't recycled ever
 * until the start of the next top level declaration.
 * 
 * Revision 1.5  89/09/02  22:08:56  benson
 * mark things deleted.
 * 
 * Revision 1.4  89/07/21  16:47:01  benson
 * add operator new/delete to expr, stmt, name that use free lists.
 * It speeds things up enough to be worthwhile.
 * 
 * Revision 1.3  89/07/20  17:42:10  benson
 * Rip out chunk allocator.
 * 
 * Revision 1.2  89/06/28  12:56:59  benson
 * Port of changes from 2.0beta6 odi bugfixes
 * 
   end_log

*/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.