Added a large object space.
authorDavid Anderson <dvander@alliedmods.net>
Fri Jul 06 18:57:27 2012 -0400 (2012-07-06)
changeset 505e3c49013064
parent 49 a92afa7484fd
child 51 fb324242a675
Added a large object space.
jitcraft/Heap-inl.h
jitcraft/Spaces.cpp
     1.1 --- a/jitcraft/Heap-inl.h	Fri Jul 06 09:45:21 2012 -0400
     1.2 +++ b/jitcraft/Heap-inl.h	Fri Jul 06 18:57:27 2012 -0400
     1.3 @@ -94,6 +94,11 @@
     1.4  inline Address
     1.5  Heap::newLargeObject(size_t bytes)
     1.6  {
     1.7 +    if (Address address = largeSpace_.allocate(bytes))
     1.8 +        return address;
     1.9 +
    1.10 +    reclaim();
    1.11 +
    1.12      return largeSpace_.allocate(bytes);
    1.13  }
    1.14  
     2.1 --- a/jitcraft/Spaces.cpp	Fri Jul 06 09:45:21 2012 -0400
     2.2 +++ b/jitcraft/Spaces.cpp	Fri Jul 06 18:57:27 2012 -0400
     2.3 @@ -108,17 +108,44 @@
     2.4      }
     2.5  }
     2.6  
     2.7 +LargeObjectSpace::LargeObjectSpace()
     2.8 +  : first_(NULL),
     2.9 +    last_(NULL)
    2.10 +{
    2.11 +}
    2.12 +
    2.13 +LargeObjectSpace::~LargeObjectSpace()
    2.14 +{
    2.15 +    while (first_) {
    2.16 +        HeapChunk *temp = first_->next();
    2.17 +        HeapChunk::Destroy(first_);
    2.18 +        first_ = temp;
    2.19 +    }
    2.20 +}
    2.21 +
    2.22 +bool
    2.23 +LargeObjectSpace::initialize()
    2.24 +{
    2.25 +    return true;
    2.26 +}
    2.27  
    2.28  Address
    2.29  LargeObjectSpace::allocate(size_t nbytes)
    2.30  {
    2.31      assert(IsAligned(nbytes, kObjectAlignment));
    2.32  
    2.33 -    if (last_) {
    2.34 -        if (Address addr = last_->allocate(nbytes))
    2.35 -            return addr;
    2.36 -    }
    2.37 +    // Always allocate a new chunk for large objects.
    2.38 +    HeapChunk *chunk = HeapChunk::New(last_, nbytes);
    2.39 +    if (!chunk)
    2.40 +        return NULL;
    2.41  
    2.42 +    if (!first_)
    2.43 +        first_ = chunk;
    2.44 +    last_ = chunk;
    2.45  
    2.46 +    Address address = chunk->allocate(nbytes);
    2.47 +    assert(address);
    2.48 +
    2.49 +    return address;
    2.50  }
    2.51