jitcraft/Heap.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 23:37:12 2012 -0700 (2012-07-02)
changeset 28 a9665857cfd5
parent 27 28697d267222
child 49 a92afa7484fd
permissions -rw-r--r--
Added MacOS, gcc, and clang support. Preliminary crappy autoconf scripts of course.
dvander@28
     1
/*
dvander@28
     2
 * Copyright (C) 2012 David Anderson
dvander@28
     3
 *
dvander@28
     4
 * This file is part of JITCraft.
dvander@28
     5
 *
dvander@28
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@28
     7
 * the terms of the GNU General Public License as published by the Free
dvander@28
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@28
     9
 * any later version.
dvander@28
    10
 * 
dvander@28
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@28
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@28
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@28
    14
 *
dvander@28
    15
 * You should have received a copy of the GNU General Public License along with
dvander@28
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@28
    17
 */
dvander@28
    18
#ifndef _include_jitcraft_heap_h_
dvander@28
    19
#define _include_jitcraft_heap_h_
dvander@28
    20
dvander@28
    21
#include "Utility.h"
dvander@28
    22
#include "Spaces.h"
dvander@28
    23
#include "Barriers.h"
dvander@28
    24
#include "Objects.h"
dvander@28
    25
#include "Handles.h"
dvander@28
    26
dvander@28
    27
namespace jc {
dvander@28
    28
dvander@28
    29
class Zone;
dvander@28
    30
dvander@28
    31
// Heap-allocated objects go here. Heaps are thread-local.
dvander@28
    32
class Heap
dvander@28
    33
{
dvander@28
    34
    Zone *zone_;
dvander@28
    35
    HeapStack lifoSpace_;
dvander@28
    36
    OldSpace mapSpace_;
dvander@28
    37
    OldSpace oldSpace_;
dvander@28
    38
dvander@28
    39
    Map *metaMap_;
dvander@28
    40
dvander@11
    41
  public:
dvander@28
    42
    enum Tenure {
dvander@28
    43
        // Default, objects go into the nursery.
dvander@28
    44
        Tenure_Default,
dvander@28
    45
        
dvander@28
    46
        // If objects are proven to not escape the stack, they can go into
dvander@28
    47
        // a LIFO arena. Allocation on the LIFO arena is not guaranteed to
dvander@28
    48
        // succeed; thus, objects may still be allocated in other arenas.
dvander@28
    49
        Tenure_Stack,
dvander@28
    50
dvander@28
    51
        // Objects that should not go into the nursery (i.e. are expected
dvander@28
    52
        // to be long-living) go here.
dvander@28
    53
        Tenure_Old
dvander@28
    54
    };
dvander@28
    55
dvander@28
    56
  private:
dvander@28
    57
    Address newOldObject(size_t bytes);
dvander@28
    58
    inline Address newStackObject(size_t bytes);
dvander@28
    59
    inline Address newObject(size_t bytes, Tenure pretenure);
dvander@11
    60
dvander@28
    61
  public:
dvander@28
    62
    Heap(Zone *zone);
dvander@28
    63
    bool initialize();
dvander@28
    64
dvander@28
    65
    inline Object *allocate(Handle<Map> map, size_t byes, Tenure pretenure);
dvander@28
    66
    Map *allocateMap(MapKind kind, size_t bytes);
dvander@28
    67
dvander@28
    68
    Map *metaMap() {
dvander@28
    69
        return metaMap_;
dvander@28
    70
    }
dvander@28
    71
    inline Address lifoPosition() const {
dvander@28
    72
        return lifoSpace_.position();
dvander@28
    73
    }
dvander@28
    74
    inline void unwindLifo(Address to) {
dvander@28
    75
        lifoSpace_.unwind(to);
dvander@28
    76
    }
dvander@28
    77
};
dvander@28
    78
dvander@28
    79
}
dvander@28
    80
dvander@28
    81
#endif //_include_jitcraft_heap_h_