Changeset 03b87140
- Timestamp:
- Sep 4, 2020, 2:31:47 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- d2bb298
- Parents:
- 843ca9f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/heap.cfa
r843ca9f r03b87140 1233 1233 // Attempt to reuse existing storage. 1234 1234 HeapManager.Storage.Header * header = headerAddr( oaddr ); 1235 if ( unlikely ( ( header->kind.fake.alignment & 1 == 1 && // old fake header ? 1235 bool isFakeHeader = header->kind.fake.alignment & 1 == 1; // old fake header ? 1236 if ( unlikely ( ( isFakeHeader && 1236 1237 (uintptr_t)oaddr % nalign == 0 && // lucky match ? 1237 1238 header->kind.fake.alignment <= nalign && // ok to leave LSB at 1 1238 1239 nalign <= 128 ) // not too much alignment storage wasted ? 1239 || ( header->kind.fake.alignment & 1 != 1 &&// old real header ( aligned on libAlign ) ?1240 || ( (!isFakeHeader) && // old real header ( aligned on libAlign ) ? 1240 1241 nalign == libAlign() ) ) ) { // new alignment also on libAlign 1241 1242 … … 1246 1247 1247 1248 if ( size <= odsize && odsize <= size * 2 ) { // allow 50% wasted data storage 1248 headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same) 1249 if ( isFakeHeader ) { 1250 headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same) 1251 } 1249 1252 1250 1253 header->kind.real.blockSize &= -2; // turn off 0 fill … … 1287 1290 1288 1291 // Attempt to reuse existing storage. 1289 if ( unlikely ( ( header->kind.fake.alignment & 1 == 1 && // old fake header ? 1292 bool isFakeHeader = header->kind.fake.alignment & 1 == 1; // old fake header ? 1293 if ( unlikely ( ( isFakeHeader && 1290 1294 (uintptr_t)oaddr % nalign == 0 && // lucky match ? 1291 1295 header->kind.fake.alignment <= nalign && // ok to leave LSB at 1 1292 1296 nalign <= 128 ) // not too much alignment storage wasted ? 1293 || ( header->kind.fake.alignment & 1 != 1 &&// old real header ( aligned on libAlign ) ?1297 || ( (!isFakeHeader) && // old real header ( aligned on libAlign ) ? 1294 1298 nalign == libAlign() ) ) ) { // new alignment also on libAlign 1295 1299 1296 headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same) 1300 if ( isFakeHeader ) { 1301 headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same) 1302 } 1297 1303 return realloc( oaddr, size ); 1298 1304
Note: See TracChangeset
for help on using the changeset viewer.