diff options
Diffstat (limited to 'tree/src/vi/ex-070224/malloc.c')
| -rw-r--r-- | tree/src/vi/ex-070224/malloc.c | 364 |
1 files changed, 0 insertions, 364 deletions
diff --git a/tree/src/vi/ex-070224/malloc.c b/tree/src/vi/ex-070224/malloc.c deleted file mode 100644 index 738144d..0000000 --- a/tree/src/vi/ex-070224/malloc.c +++ /dev/null @@ -1,364 +0,0 @@ -/* - * AT&T Unix 7th Edition memory allocation routines. - * - * Modified for ex by Gunnar Ritter, Freiburg i. Br., Germany, - * July 2000. - * - * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * Redistributions of source code and documentation must retain the - * above copyright notice, this list of conditions and the following - * disclaimer. - * 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. - * All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed or owned by Caldera - * International, Inc. - * Neither the name of Caldera International, Inc. nor the names of - * other contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA - * INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. - * - * @(#)malloc.c 1.19 (gritter) 2/20/05 - */ - -#ifdef VMUNIX - -#include <sys/types.h> -#include <unistd.h> -#include <errno.h> - -#include "config.h" - -#ifdef LANGMSG -#include <nl_types.h> -extern nl_catd catd; -#else -#define catgets(a, b, c, d) (d) -#endif - -/* - * Since ex makes use of sbrk(), the C library's version of malloc() - * must be avoided. - * - * In ex, malloc() calls sbrk() only one time with an argument of - * POOL. Ex itselves never uses malloc() internally, so POOL - * must be sufficient for library calls like setlocale() only. - * - * Known problem: If linking against ncurses, changing the terminal - * type repeatedly outruns the pool. Even that is not really a - * problem since the work continues with the old terminal type, so - * there is no need for a large pool here. - */ -#define POOL 32768 - -#ifdef debug -#define ASSERT(p) if(!(p))botch("p");else -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -int -botch(char *s) -{ - const char msg[] = "assertion botched\n"; - write(2, msg, sizeof msg - 1); - /*printf("assertion botched: %s\n",s);*/ - abort(); -} -static int allock(void); -#else -#define ASSERT(p) -#endif - -/* avoid break bug */ -#ifdef pdp11 -#define GRANULE 64 -#else -#define GRANULE 0 -#endif -/* C storage allocator - * circular first-fit strategy - * works with noncontiguous, but monotonically linked, arena - * each block is preceded by a ptr to the (pointer of) - * the next following block - * blocks are exact number of words long - * aligned to the data type requirements of ALIGN - * pointers to blocks must have BUSY bit 0 - * bit in ptr is 1 for busy, 0 for idle - * gaps in arena are merely noted as busy blocks - * last block of arena (pointed to by alloct) is empty and - * has a pointer to first - * idle blocks are coalesced during space search - * - * a different implementation may need to redefine - * ALIGN, NALIGN, BLOCK, BUSY, INT - * where INT is integer type to which a pointer can be cast -*/ -#define INT intptr_t -#define ALIGN intptr_t -#define NALIGN 1 -#define WORD sizeof (union store) -#define BLOCK 1024 /* a multiple of WORD*/ -#define BUSY ((intptr_t)1) -#ifdef NULL -#undef NULL -#endif -#define NULL 0 -#define testbusy(p) ((INT)(p)&BUSY) -#define setbusy(p) (union store *)((INT)(p)|BUSY) -#define clearbusy(p) (union store *)((INT)(p)&~BUSY) - -union store { union store *ptr; - ALIGN dummy[NALIGN]; - INT callocsp; /*calloc clears an array of integers*/ -}; - -static union store allocs[2]; /*initial arena*/ -static union store *allocp; /*search ptr*/ -static union store *alloct; /*arena top*/ -static union store *allocx; /*for benefit of realloc*/ -extern int error(char *, ...); - -char * -poolsbrk(intptr_t inc) -{ - static char *pool; - static intptr_t ps; - intptr_t os, ns; - - if (pool == NULL) - if ((pool = sbrk(POOL)) == (char *)-1) - error(catgets(catd, 1, 241, - "No memory pool")); - if (inc == 0) - return pool + ps; - os = ps; - ns = ps + inc; - if (ns >= POOL) - error(catgets(catd, 1, 242, - "Memory pool exhausted")); - ps = ns; - return pool + os; -} - -void * -malloc(size_t nbytes) -{ - register union store *p, *q; - register int nw; - static int temp; /*coroutines assume no auto*/ - - if(allocs[0].ptr==0) { /*first time*/ - allocs[0].ptr = setbusy(&allocs[1]); - allocs[1].ptr = setbusy(&allocs[0]); - alloct = &allocs[1]; - allocp = &allocs[0]; - } - nw = (nbytes+WORD+WORD-1)/WORD; - ASSERT(allocp>=allocs && allocp<=alloct); - ASSERT(allock()); - for(p=allocp; ; ) { - for(temp=0; ; ) { - if(!testbusy(p->ptr)) { - while(!testbusy((q=p->ptr)->ptr)) { - int ua = p->ptr==allocp; - ASSERT(q>p&&q<alloct); - p->ptr = q->ptr; - if (ua) - allocp = p->ptr; - } - if(q>=p+nw && p+nw>=p) - goto found; - } - q = p; - p = clearbusy(p->ptr); - if(p>q) - ASSERT(p<=alloct); - else if(q!=alloct || p!=allocs) { - ASSERT(q==alloct&&p==allocs); - errno = ENOMEM; - return(NULL); - } else if(++temp>1) - break; - } - temp = ((nw+BLOCK/WORD)/(BLOCK/WORD))*(BLOCK/WORD); - q = (union store *)poolsbrk(0); - if(q+temp+GRANULE < q) { - errno = ENOMEM; - return(NULL); - } - q = (union store *)poolsbrk(temp*WORD); - if((INT)q == -1) { - errno = ENOMEM; - return(NULL); - } - ASSERT(q>alloct); - alloct->ptr = q; - if(q!=alloct+1) - alloct->ptr = setbusy(alloct->ptr); - alloct = q->ptr = q+temp-1; - alloct->ptr = setbusy(allocs); - } -found: - allocp = p + nw; - ASSERT(allocp<=alloct); - if(q>allocp) { - allocx = allocp->ptr; - allocp->ptr = p->ptr; - } - p->ptr = setbusy(allocp); - return((char *)(p+1)); -} - -/* freeing strategy tuned for LIFO allocation -*/ -void -free(register void *ap) -{ - register union store *p = ap; - - if (ap == NULL) - return; - ASSERT(p>clearbusy(allocs[1].ptr)&&p<=alloct); - ASSERT(allock()); - allocp = --p; - ASSERT(testbusy(p->ptr)); - p->ptr = clearbusy(p->ptr); - ASSERT(p->ptr > allocp && p->ptr <= alloct); -} - -/* realloc(p, nbytes) reallocates a block obtained from malloc() - * and freed since last call of malloc() - * to have new size nbytes, and old content - * returns new location, or 0 on failure -*/ - -void * -realloc(void *ap, size_t nbytes) -{ - register union store *p = ap; - register union store *q; - union store *s, *t; - register size_t nw; - size_t onw; - - if (p == NULL) - return malloc(nbytes); - if (nbytes == 0) { - free(p); - return NULL; - } - if(testbusy(p[-1].ptr)) - free(p); - onw = p[-1].ptr - p; - q = malloc(nbytes); - if(q==NULL || q==p) - return(q); - s = p; - t = q; - nw = (nbytes+WORD-1)/WORD; - if(nw<onw) - onw = nw; - while(onw--!=0) - *t++ = *s++; - if(q<p && q+nw>=p) - (q+(q+nw-p))->ptr = allocx; - return(q); -} - -#ifdef debug -int -allock(void) -{ -#ifdef longdebug - register union store *p; - int x; - x = 0; - for(p= &allocs[0]; clearbusy(p->ptr) > p; p=clearbusy(p->ptr)) { - if(p==allocp) - x++; - } - ASSERT(p==alloct); - return(x==1|p==allocp); -#else - return(1); -#endif -} -#endif - -/* calloc - allocate and clear memory block -*/ -#define CHARPERINT (sizeof(INT)/sizeof(char)) - -void * -calloc(size_t num, size_t size) -{ - register char *mp; - register INT *q; - register int m; - - num *= size; - mp = malloc(num); - if(mp == NULL) - return(NULL); - q = (INT *) mp; - m = (num+CHARPERINT-1)/CHARPERINT; - while(--m >= 0) - *q++ = 0; - return(mp); -} - -#ifdef notdef -/*ARGSUSED*/ -void -cfree(char *p, size_t num, size_t size) -{ - free(p); -} - -/* - * Just in case ... - */ -char * -memalign(size_t alignment, size_t size) -{ - return NULL; -} - -char * -valloc(size_t size) -{ - return NULL; -} - -char * -mallinfo(void) -{ - return NULL; -} - -int -mallopt(void) -{ - return -1; -} -#endif /* notdef */ - -#endif /* VMUNIX */ |
