Ignore:
Timestamp:
Feb 16, 2012, 10:56:03 PM (7 years ago)
Author:
ksherdy
Message:

Fixed aligned_allocation memory corruption. Updated both aligned and
unaligned implementation to follow identical logic.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/allocator.hpp

    r1937 r1938  
    7171                        }
    7272
    73                         available = segment_size;
    74                         n = segment_size;
    75 
    7673                        next->next = NULL;
    7774                        tail->next = next;
    7875                        tail = next;
     76
     77                        uint64_t address = reinterpret_cast<uint64_t>(&(tail->segment[0]));
     78                        allocd_segment_size = segment_size;
     79                        available = 0;
     80
     81                        return (void *) (address);
    7982                }
    8083
     
    8790                return (void *) (address);
    8891        }
    89 /*
     92
    9093        void * allocate_aligned(uint64_t n, uint64_t & allocd_segment_size) {
    9194
    9295                uint64_t n_padded = (n+ALIGNMENT-1);
     96
     97                cout << "BOO " << n_padded << ":" << available << endl;
    9398
    9499                if(n_padded > available) {
     
    108113                        }
    109114
    110                         available = segment_size;
    111                         //n = segment_size;
    112 
    113115                        next->next = NULL;
    114116                        tail->next = next;
    115117                        tail = next;
     118
     119                        uint64_t address = reinterpret_cast<uint64_t>(&(tail->segment[0]));
     120                        uint64_t padding = ((address % ALIGNMENT) == 0) ? 0 :  ALIGNMENT - (address % ALIGNMENT);
     121                        allocd_segment_size = segment_size - padding;
     122                        available = 0;
     123
     124                        assert(((uint64_t)(address + padding))%ALIGNMENT == 0);
     125                        return (void *) (address + padding);
    116126                }
    117127
     
    119129                uint64_t address = reinterpret_cast<uint64_t>(&(tail->segment[i]));
    120130                uint64_t padding = ((address % ALIGNMENT) == 0) ? 0 :  ALIGNMENT - (address % ALIGNMENT);
    121 
    122                 allocd_segment_size = available;
     131                allocd_segment_size = n - padding;
    123132                available -= (padding + n);
    124133
     
    127136                return (void *) (address + padding);
    128137        }
    129 */
     138
    130139        void destroy() {
    131140                node * crt = head.next;
Note: See TracChangeset for help on using the changeset viewer.