jitcraft/Zone.h
author David Anderson <dvander@alliedmods.net>
Sat Jul 07 17:11:31 2012 -0700 (2012-07-07)
changeset 53 13bd3a8df334
parent 45 25b995bc75a0
child 54 8e22792a3921
permissions -rw-r--r--
Added a mark-sweep garbage collector.
dvander@28
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@28
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@0
     5
 * This file is part of JITCraft.
dvander@0
     6
 *
dvander@0
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@0
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@0
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@0
    19
#ifndef _include_jitcraft_thread_h_
dvander@0
    20
#define _include_jitcraft_thread_h_
dvander@0
    21
dvander@0
    22
#include "PoolAllocator.h"
dvander@0
    23
#include "Stack.h"
dvander@11
    24
#include "Heap.h"
dvander@11
    25
#include "Barriers.h"
dvander@27
    26
#include "Handles.h"
dvander@29
    27
#include "RootScopes.h"
dvander@45
    28
#include "VirtualObjectVisitor.h"
dvander@0
    29
dvander@0
    30
namespace jc {
dvander@0
    31
dvander@11
    32
class TypeManager;
dvander@11
    33
dvander@0
    34
class Zone
dvander@0
    35
{
dvander@0
    36
    PoolAllocator pool_;
dvander@0
    37
    Stack stack_;
dvander@11
    38
    Heap heap_;
dvander@11
    39
dvander@11
    40
    // Map cache.
dvander@11
    41
    Unbarriered<Map> maps_[MapKinds_Total];
dvander@11
    42
dvander@11
    43
    TypeManager *types_;
dvander@0
    44
dvander@27
    45
    // Root list.
dvander@28
    46
    Local<Object> *lastLocalRoot_;
dvander@29
    47
    RootScopeManager rootScopes_;
dvander@27
    48
dvander@0
    49
  public:
dvander@11
    50
    Zone();
dvander@0
    51
    bool initialize();
dvander@0
    52
dvander@0
    53
    PoolAllocator &pool() {
dvander@0
    54
        return pool_;
dvander@0
    55
    }
dvander@0
    56
    Stack &stack() {
dvander@0
    57
        return stack_;
dvander@0
    58
    }
dvander@11
    59
    Heap &heap() {
dvander@11
    60
        return heap_;
dvander@11
    61
    }
dvander@11
    62
    Object *allocate(MapKind kind, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@11
    63
        assert(maps_[kind]);
dvander@53
    64
        Local<Map> map(this, maps_[kind]);
dvander@28
    65
        return allocate(map, bytes, tenure);
dvander@12
    66
    }
dvander@27
    67
    Object *allocate(Handle<Map> map, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@27
    68
        return heap_.allocate(map, bytes, tenure);
dvander@27
    69
    }
dvander@53
    70
    Map *getMap(MapKind kind) {
dvander@53
    71
        return maps_[kind];
dvander@53
    72
    }
dvander@12
    73
    Map *allocateMap(MapKind kind, size_t bytes, MapKind parent = MapKind_Meta);
dvander@11
    74
    TypeManager *types() const {
dvander@11
    75
        return types_;
dvander@11
    76
    }
dvander@28
    77
dvander@28
    78
    Local<Object> **lastLocalRoot() {
dvander@28
    79
        return &lastLocalRoot_;
dvander@28
    80
    }
dvander@29
    81
    Object **makeScopedRoot(Object *ptr) {
dvander@29
    82
        return rootScopes_.make(ptr);
dvander@29
    83
    }
dvander@29
    84
    RootScopeManager &rootScopes() {
dvander@29
    85
        return rootScopes_;
dvander@29
    86
    }
dvander@45
    87
dvander@45
    88
    void accept(VirtualObjectVisitor *visitor);
dvander@0
    89
};
dvander@0
    90
dvander@0
    91
// In a multi-threaded system, this would be a TLS variable.
dvander@0
    92
// In the interest of simplicity, we are single-threaded for now.
dvander@0
    93
extern Zone SingleThreadedZone;
dvander@0
    94
dvander@0
    95
static inline Zone *ZONE()
dvander@0
    96
{
dvander@0
    97
    return &SingleThreadedZone;
dvander@0
    98
}
dvander@0
    99
dvander@0
   100
class LocalTop
dvander@0
   101
{
dvander@28
   102
    Top &mine_;
dvander@0
   103
    Top *prev_;
dvander@0
   104
dvander@0
   105
  public:
dvander@0
   106
    LocalTop(Top &mine)
dvander@0
   107
      : mine_(mine),
dvander@0
   108
        prev_(ZONE()->stack().top())
dvander@0
   109
    {
dvander@0
   110
        ZONE()->stack().setTop(&mine_);
dvander@0
   111
    }
dvander@0
   112
dvander@0
   113
    ~LocalTop()
dvander@0
   114
    {
dvander@0
   115
        ZONE()->stack().setTop(prev_);
dvander@0
   116
    }
dvander@0
   117
};
dvander@0
   118
dvander@28
   119
template <typename T>
dvander@28
   120
Local<T>::Local(Zone *zone, T *thing)
dvander@28
   121
  : zone_(zone),
dvander@28
   122
    thing_(thing),
dvander@28
   123
    prev_(*zone->lastLocalRoot())
dvander@28
   124
{
dvander@28
   125
    *zone->lastLocalRoot() = toRaw();
dvander@0
   126
}
dvander@0
   127
dvander@28
   128
template <typename T>
dvander@28
   129
Local<T>::~Local()
dvander@28
   130
{
dvander@28
   131
    assert(*zone_->lastLocalRoot() == toRaw());
dvander@28
   132
    *zone_->lastLocalRoot() = prev_;
dvander@28
   133
}
dvander@28
   134
dvander@29
   135
template <typename T>
dvander@53
   136
ScopedRoot<T>::ScopedRoot()
dvander@53
   137
  : thingp_(make(NULL))
dvander@53
   138
{
dvander@53
   139
}
dvander@53
   140
dvander@53
   141
template <typename T>
dvander@29
   142
ScopedRoot<T>::ScopedRoot(T *thing)
dvander@34
   143
  : thingp_(make(thing))
dvander@29
   144
{
dvander@29
   145
    // Type check that T is an Object.
dvander@29
   146
    (void)static_cast<Object *>(thing);
dvander@29
   147
}
dvander@29
   148
dvander@29
   149
template <typename T> T **
dvander@29
   150
ScopedRoot<T>::make(T *other)
dvander@29
   151
{
dvander@29
   152
    return reinterpret_cast<T **>(ZONE()->makeScopedRoot(other));
dvander@29
   153
}
dvander@29
   154
dvander@29
   155
RootScope::RootScope(Zone *zone)
dvander@29
   156
  : zone_(zone),
dvander@29
   157
    position_(zone->rootScopes().position()),
dvander@29
   158
    prev_(*zone->rootScopes().scope())
dvander@29
   159
{
dvander@29
   160
    *zone->rootScopes().scope() = this;
dvander@29
   161
}
dvander@29
   162
dvander@29
   163
RootScope::~RootScope()
dvander@29
   164
{
dvander@29
   165
    zone_->rootScopes().unwind(position_);
dvander@29
   166
    *zone_->rootScopes().scope() = prev_;
dvander@29
   167
}
dvander@29
   168
dvander@28
   169
}
dvander@28
   170
dvander@28
   171
#endif // _include_jitcraft_thread_h_