Changeset f0b3f51
- Timestamp:
- Jul 27, 2018, 7:22:41 AM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- b9c04946
- Parents:
- 91788fa
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/heap.c
r91788fa rf0b3f51 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jul 25 16:42:02201813 // Update Count : 4 3812 // Last Modified On : Thu Jul 26 22:28:23 2018 13 // Update Count : 449 14 14 // 15 15 … … 111 111 // return temp; 112 112 // } // prtHeapTermOff 113 114 115 #ifdef __CFA_DEBUG__ 116 static unsigned int allocfree; // running total of allocations minus frees 117 static unsigned int appStart; // storage allocation when application starts 118 119 static void checkUnfreed() { 120 unsigned int total = allocfree - appStart; 121 if ( total != 0 ) { 122 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT. 123 // char helpText[512]; 124 // int len = snprintf( helpText, 512, "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n" 125 // "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n", 126 // (long int)getpid(), total, total ); // always print the UNIX pid 127 // __cfaabi_dbg_bits_write( helpText, len ); 128 } // if 129 } // checkUnfreed 130 131 extern "C" { 132 void heapAppStart() { // called by __cfaabi_appready_startup 133 appStart = allocfree; 134 } // heapAppStart 135 136 void heapAppStop() { // called by __cfaabi_appready_startdown 137 checkUnfreed(); 138 } // heapAppStop 139 } // extern "C" 140 #endif // __CFA_DEBUG__ 113 141 114 142 … … 139 167 static int mmapFd = -1; // fake or actual fd for anonymous file 140 168 141 static unsigned int allocfree; // running total of allocations minus frees142 static unsigned int appStart; // storage allocation when application starts143 144 static void checkUnfreed() {145 #ifdef __CFA_DEBUG__146 unsigned int total = allocfree - appStart;147 if ( total != 0 ) {148 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.149 // char helpText[512];150 // int len = snprintf( helpText, 512, "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n"151 // "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",152 // (long int)getpid(), total, total ); // always print the UNIX pid153 // __cfaabi_dbg_bits_write( helpText, len );154 } // if155 #endif // __CFA_DEBUG__156 } // checkUnfreed157 158 #ifdef __CFA_DEBUG__159 extern "C" {160 void heapAppStart() { // called by __cfaabi_appready_startup161 appStart = allocfree;162 } // heapAppStart163 164 void heapAppStop() { // called by __cfaabi_appready_startdown165 checkUnfreed();166 } // heapAppStop167 } // extern "C"168 #endif // __CFA_DEBUG__169 170 169 171 170 struct HeapManager { … … 178 177 union { 179 178 struct { // 32-bit word => 64-bit header, 64-bit word => 128-bit header 180 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __ U_WORDSIZE__ == 32179 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __SIZEOF_POINTER__ == 4 181 180 uint32_t padding; // unused, force home/blocksize to overlay alignment in fake header 182 #endif // __ U_WORDSIZE__ == 32&& __U_WORDSIZE__ == 32181 #endif // __ORDER_BIG_ENDIAN__ && __U_WORDSIZE__ == 32 183 182 184 183 union { … … 191 190 }; 192 191 193 #if __BYTE_ORDER__ == __ORDER_ BIG_ENDIAN__ && __U_WORDSIZE__ == 32192 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_POINTER__ == 4 194 193 uint32_t padding; // unused, force home/blocksize to overlay alignment in fake header 195 #endif // __ U_WORDSIZE__ == 32&& __U_WORDSIZE__ == 32194 #endif // __ORDER_LITTLE_ENDIAN__ && __U_WORDSIZE__ == 32 196 195 197 196 }; … … 204 203 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 205 204 uint32_t alignment; // low-order bits of home/blockSize used for tricks 206 #endif // __ BYTE_ORDER__205 #endif // __ORDER_LITTLE_ENDIAN__ 207 206 208 207 uint32_t offset; … … 210 209 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 211 210 uint32_t alignment; // low-order bits of home/blockSize used for tricks 212 #endif // __ BYTE_ORDER__211 #endif // __ORDER_BIG_ENDIAN__ 213 212 } fake; 214 213 } kind; … … 305 304 #endif // __CFA_DEBUG__ 306 305 306 assert( heapManager.heapBegin == 0 ); 307 307 heapManager{}; 308 308 } // memory_startup … … 672 672 673 673 static inline void * malloc2( size_t size ) { // necessary for malloc statistics 674 assert( heapManager.heapBegin != 0 ) ; // heap started 674 assert( heapManager.heapBegin != 0 ); 675 675 void * area = doMalloc( size ); 676 676 if ( unlikely( area == 0 ) ) errno = ENOMEM; // POSIX
Note: See TracChangeset
for help on using the changeset viewer.