|
|
1.1 ! root 1: /******************************************************************* ! 2: * * ! 3: * File: CIFPLOT/alloc.c * ! 4: * Written by Dan Fitzpatrick * ! 5: * copyright 1980 -- Regents of the University of California * ! 6: * * ! 7: ********************************************************************/ ! 8: ! 9: #include <stdio.h> ! 10: #include "defs.h" ! 11: ! 12: IMPORT int *malloc(); ! 13: IMPORT int *realloc(); ! 14: ! 15: #define BLOCKSIZE 4 /* Memory is allocated in multiples of BLOCKSIZE */ ! 16: ! 17: /* ALLOC_ID, PALLOC_ID, & FREED_ID are used to mark memory as ! 18: * allocated, permanently allocated, & freed, repectively */ ! 19: #define ALLOC_ID 0xAA00FFFF ! 20: #define PALLOC_ID 0x55AAA0F0 ! 21: #define FREED_ID 0xAFFA8118 ! 22: ! 23: /* size returns how much memory 'x' points to */ ! 24: #define size(x) ( *(x-1) - ((int) x) + 1 ) ! 25: ! 26: /* These are variables that are used to keep track of how much ! 27: * memory has been allocated. */ ! 28: int AllocCount,FreeCount,AllocBytes; ! 29: int FreeBytes,PallocCount,PallocBytes,MaxBytes; ! 30: ! 31: int * ! 32: alloc(nbytes) ! 33: int nbytes; ! 34: /* Returns a pointer to a block of memory of size 'nbytes' */ ! 35: { ! 36: int nunits; ! 37: int *ptr; ! 38: ! 39: #ifdef ADEBUG ! 40: nbytes += sizeof(int); ! 41: #endif ! 42: ! 43: nunits = ((nbytes-1)/BLOCKSIZE) + 1; ! 44: if (NULL == (ptr = malloc(nunits*BLOCKSIZE))) ! 45: Error("Out of space!\n",INTERNAL); ! 46: ! 47: #ifdef ADEBUG ! 48: /* Set up an identifier to show this has been allocated */ ! 49: *ptr = ALLOC_ID; ! 50: AllocCount++; ! 51: AllocBytes += size(ptr); ! 52: if( (AllocBytes-FreeBytes) > MaxBytes ) ! 53: MaxBytes = AllocBytes - FreeBytes; ! 54: return(++ptr); ! 55: #else ! 56: return(ptr); ! 57: #endif ! 58: } ! 59: ! 60: int * ! 61: palloc(n) ! 62: int n; ! 63: /* Allocate n bytes of permanent memory (this memory will not be freed) */ ! 64: { ! 65: int *p; ! 66: p = alloc(n); ! 67: #ifdef ADEBUG ! 68: PallocCount++; ! 69: PallocBytes += n; ! 70: *(p-1) = PALLOC_ID; ! 71: #endif ! 72: return(p); ! 73: } ! 74: ! 75: Free(ptr) ! 76: int *ptr; ! 77: /* Free the block of memory pointed to by 'ptr'. This memory must ! 78: * have been allocated by 'alloc'. */ ! 79: { ! 80: ! 81: #ifdef ADEBUG ! 82: /* Check to see that the memory was allocated by 'alloc' */ ! 83: --ptr; ! 84: if( *ptr != ALLOC_ID) ! 85: if( *ptr == PALLOC_ID ) ! 86: Error("Tried to Free Permanent Storage",INTERNAL); ! 87: else ! 88: if( *ptr == FREED_ID ) ! 89: Error("Tried to Free an already free block",INTERNAL); ! 90: else ! 91: Error("Tried to Free an Unallocated Block",INTERNAL); ! 92: /* Mark this memory as free, if memory is freed again flag an error */ ! 93: *ptr = FREED_ID; ! 94: FreeCount++; ! 95: FreeBytes += size(ptr); ! 96: #endif ! 97: free(ptr); ! 98: return; ! 99: } ! 100: ! 101: int * ! 102: expand(ptr, n) ! 103: int *ptr; ! 104: int n; ! 105: /* 'expand' changes the size of an array pointed to by 'ptr' to be an ! 106: * array of n bytes. This is useful to avoid table overflow. Instead ! 107: * of aborting on overflow we can just make the table bigger. */ ! 108: { ! 109: Free(ptr); ! 110: #ifdef ADEBUG ! 111: n += sizeof(int); ! 112: ptr--; ! 113: if(*ptr != FREED_ID) ! 114: Error("Block has not been freed",INTERNAL); ! 115: #endif ! 116: ptr = realloc(ptr,n); ! 117: if(ptr == NULL) ! 118: Error("Out of memory",INTERNAL); ! 119: #ifdef ADEBUG ! 120: if(*ptr != FREED_ID) ! 121: Error("Block has not been copied correctly",INTERNAL); ! 122: *ptr = ALLOC_ID; ! 123: AllocCount++; ! 124: AllocBytes += size(ptr); ! 125: if( (AllocBytes-FreeBytes) > MaxBytes ) ! 126: MaxBytes = AllocBytes - FreeBytes; ! 127: return(++ptr); ! 128: #else ! 129: return(ptr); ! 130: #endif ! 131: } ! 132: ! 133: int acnt0,acnt1,acnt2,acnt3,acnt4,acnt5,acnt6,acnt7,acnt8,acnt9; ! 134: int bcnt0,bcnt1,bcnt2,bcnt3,bcnt4,bcnt5,bcnt6,bcnt7,bcnt8,bcnt9; ! 135: ! 136: AllocSummary() ! 137: /* Prints out statistics of memory allocated */ ! 138: { ! 139: fprintf(stderr,"%6d blocks, %8d bytes allocated\n",AllocCount,AllocBytes); ! 140: fprintf(stderr,"%6d blocks, %8d bytes permanent requests\n",PallocCount,PallocBytes); ! 141: fprintf(stderr,"%6d blocks, %8d bytes freed\n",FreeCount,FreeBytes); ! 142: fprintf(stderr,"%6d blocks, %8d bytes unretrieved\n", ! 143: AllocCount-FreeCount,AllocBytes-FreeBytes); ! 144: fprintf(stderr,"%8d bytes were required\n",MaxBytes); ! 145: fprintf(stderr,"\nPlot Time allocation\n"); ! 146: fprintf(stderr,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", ! 147: acnt0,acnt1,acnt2,acnt3,acnt4,acnt5,acnt6,acnt7,acnt8,acnt9); ! 148: fprintf(stderr,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", ! 149: bcnt0,bcnt1,bcnt2,bcnt3,bcnt4,bcnt5,bcnt6,bcnt7,bcnt8,bcnt9); ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.