Changeset 03b87140


Ignore:
Timestamp:
Sep 4, 2020, 2:31:47 PM (4 years ago)
Author:
m3zulfiq <m3zulfiq@…>
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
Message:

removed bug from resize/realloc with alignment so alignment is not set in absence of fake header

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/heap.cfa

    r843ca9f r03b87140  
    12331233        // Attempt to reuse existing storage.
    12341234        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 &&
    12361237                                 (uintptr_t)oaddr % nalign == 0 &&                              // lucky match ?
    12371238                                 header->kind.fake.alignment <= nalign &&               // ok to leave LSB at 1
    12381239                                 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 ) ?
    12401241                                 nalign == libAlign() ) ) ) {                                   // new alignment also on libAlign
    12411242
     
    12461247
    12471248                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                        }
    12491252
    12501253                        header->kind.real.blockSize &= -2;              // turn off 0 fill
     
    12871290
    12881291        // 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 &&
    12901294                                 (uintptr_t)oaddr % nalign == 0 &&                              // lucky match ?
    12911295                                 header->kind.fake.alignment <= nalign &&               // ok to leave LSB at 1
    12921296                                 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 ) ?
    12941298                                 nalign == libAlign() ) ) ) {                                   // new alignment also on libAlign
    12951299
    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                }
    12971303                return realloc( oaddr, size );
    12981304
Note: See TracChangeset for help on using the changeset viewer.