jitcraft/Spaces.cpp
author David Anderson <dvander@alliedmods.net>
Fri Jul 06 09:45:21 2012 -0400 (2012-07-06)
changeset 49 a92afa7484fd
parent 12 75e385f68b7e
child 50 5e3c49013064
permissions -rw-r--r--
working on large space
dvander@49
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@49
     2
 *
dvander@49
     3
 * Copyright (C) 2012 David Anderson
dvander@49
     4
 *
dvander@49
     5
 * This file is part of JITCraft.
dvander@49
     6
 *
dvander@49
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@49
     8
 * the terms of the GNU General Public License as published by the Free
dvander@49
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@49
    10
 * any later version.
dvander@49
    11
 * 
dvander@49
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@49
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@49
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@49
    15
 *
dvander@49
    16
 * You should have received a copy of the GNU General Public License along with
dvander@49
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@49
    18
 */
dvander@49
    19
#include "Spaces.h"
dvander@49
    20
#include "Platform.h"
dvander@49
    21
#include "Spaces-inl.h"
dvander@49
    22
dvander@49
    23
using namespace jc;
dvander@49
    24
dvander@49
    25
HeapStack::HeapStack()
dvander@49
    26
  : buffer_(NULL),
dvander@49
    27
    pos_(NULL),
dvander@49
    28
    end_(NULL)
dvander@49
    29
{
dvander@49
    30
}
dvander@49
    31
dvander@49
    32
HeapStack::~HeapStack()
dvander@49
    33
{
dvander@49
    34
    if (buffer_)
dvander@49
    35
        OS::UnmapAlignedMemory(map_.base(), map_.size());
dvander@49
    36
}
dvander@49
    37
dvander@49
    38
bool
dvander@49
    39
HeapStack::initialize()
dvander@49
    40
{
dvander@49
    41
    map_ = OS::MapAlignedMemory(kStackSize, kStackSize, OS::Map_Commit);
dvander@49
    42
    if (!map_.base())
dvander@49
    43
        return false;
dvander@49
    44
dvander@49
    45
    buffer_ = map_.aligned();
dvander@49
    46
    pos_ = buffer_;
dvander@49
    47
    end_ = buffer_ + kStackSize;
dvander@49
    48
    mask_ = kStackSize - 1;
dvander@49
    49
    return true;
dvander@49
    50
}
dvander@49
    51
dvander@11
    52
HeapChunk *
dvander@11
    53
HeapChunk::New(HeapChunk *prev, size_t size)
dvander@11
    54
{
dvander@11
    55
    OS::AlignableMapping map = 
dvander@11
    56
        OS::MapAlignedMemory(size, HeapChunk::kAlignment, OS::Map_Commit);
dvander@11
    57
dvander@11
    58
    if (!map.base())
dvander@11
    59
        return NULL;
dvander@11
    60
dvander@11
    61
    HeapChunk *chunk = reinterpret_cast<HeapChunk *>(map.aligned());
dvander@11
    62
    chunk->base_ = map.base();
dvander@11
    63
    chunk->end_ = map.base() + map.size();
dvander@11
    64
    chunk->cursor_ = chunk->first();
dvander@11
    65
    if (prev)
dvander@11
    66
        prev->next_ = chunk;
dvander@11
    67
dvander@11
    68
    return chunk;
dvander@11
    69
}
dvander@11
    70
dvander@11
    71
void
dvander@11
    72
HeapChunk::Destroy(HeapChunk *chunk)
dvander@11
    73
{
dvander@11
    74
    OS::UnmapAlignedMemory(chunk->base(), chunk->size());
dvander@11
    75
}
dvander@11
    76
dvander@11
    77
OldSpace::OldSpace()
dvander@11
    78
  : first_(NULL),
dvander@11
    79
    last_(NULL)
dvander@11
    80
{
dvander@11
    81
}
dvander@11
    82
dvander@11
    83
bool
dvander@11
    84
OldSpace::initialize()
dvander@11
    85
{
dvander@11
    86
    first_ = HeapChunk::New(first_, HeapChunk::kDefaultSize);
dvander@11
    87
    last_ = first_;
dvander@11
    88
dvander@11
    89
    return !!first_;
dvander@11
    90
}
dvander@11
    91
dvander@11
    92
Address
dvander@11
    93
OldSpace::allocateSlow(size_t nbytes)
dvander@11
    94
{
dvander@11
    95
    HeapChunk *chunk = HeapChunk::New(last_, HeapChunk::kDefaultSize);
dvander@11
    96
    if (!chunk)
dvander@11
    97
        return NULL;
dvander@11
    98
dvander@11
    99
    return chunk->allocate(nbytes);
dvander@11
   100
}
dvander@11
   101
dvander@11
   102
OldSpace::~OldSpace()
dvander@11
   103
{
dvander@11
   104
    while (first_) {
dvander@11
   105
        HeapChunk *temp = first_->next();
dvander@11
   106
        HeapChunk::Destroy(first_);
dvander@11
   107
        first_ = temp;
dvander@11
   108
    }
dvander@11
   109
}
dvander@49
   110
dvander@49
   111
dvander@49
   112
Address
dvander@49
   113
LargeObjectSpace::allocate(size_t nbytes)
dvander@49
   114
{
dvander@49
   115
    assert(IsAligned(nbytes, kObjectAlignment));
dvander@49
   116
dvander@49
   117
    if (last_) {
dvander@49
   118
        if (Address addr = last_->allocate(nbytes))
dvander@49
   119
            return addr;
dvander@49
   120
    }
dvander@49
   121
dvander@49
   122
dvander@49
   123
}
dvander@49
   124