da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Method for pool allocation.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** All elements in a pool have the same size.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** The following fields of Vmdata_t are used as:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** pool: size of a block.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** free: list of free blocks.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* poolalloc(Vmalloc_t* vm, reg size_t size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* look thru all segments for a suitable free block */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(tp = NIL(Block_t*), seg = vd->seg; seg; seg = seg->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(;;) /* must extend region */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if((tp = (*_Vmextend)(vm,ROUND(size,vd->incr),NIL(Vmsearch_f))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhas_blk: /* if get here, (tp, s, seg) must be well-defined */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm,NIL(Vmuchar_t*),(Vmuchar_t*)tp,vd->pool,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((Vmuchar_t*)addr < laddr || (Vmuchar_t*)addr >= baddr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* the block that has this address */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = (Block_t*)(laddr + (((Vmuchar_t*)addr-laddr)/size)*size );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see if this block has been freed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(SIZE(tp) == POOLFREE) /* may be a coincidence - make sure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int poolfree(reg Vmalloc_t* vm, reg Void_t* data )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*vm->disc->exceptf)(vm,VM_BADADDR,data,vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm, (Vmuchar_t*)data, NIL(Vmuchar_t*), vd->pool, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* poolresize(Vmalloc_t* vm, Void_t* data, size_t size, int type )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg int *d = (int*)data, *ed = (int*)((char*)data+size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { *d++ = 0;} while(d < ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*vm->disc->exceptf)(vm,VM_BADADDR,data,vm->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*_Vmtrace)(vm, (Vmuchar_t*)data, (Vmuchar_t*)data, size, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return pooladdr(vm,addr) == 0 ? (long)vm->data->pool : -1L;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else s += sizeof(Head_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Void_t* poolalign(Vmalloc_t* vm, size_t size, size_t align)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Public interface */