jitcraft/Zone.h
author David Anderson <dvander@alliedmods.net>
Sun Jul 08 15:23:48 2012 -0700 (2012-07-08)
changeset 62 e04c5be84792
parent 61 864e4b02a4c1
child 65 7c942b5adebc
permissions -rw-r--r--
Add some more API.
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@59
    30
namespace ke {
dvander@0
    31
dvander@11
    32
class TypeManager;
dvander@54
    33
class String;
dvander@54
    34
class StringPool;
dvander@61
    35
class GlobalRoots;
dvander@11
    36
dvander@0
    37
class Zone
dvander@0
    38
{
dvander@0
    39
    PoolAllocator pool_;
dvander@0
    40
    Stack stack_;
dvander@11
    41
    Heap heap_;
dvander@11
    42
dvander@11
    43
    // Map cache.
dvander@11
    44
    Unbarriered<Map> maps_[MapKinds_Total];
dvander@11
    45
dvander@11
    46
    TypeManager *types_;
dvander@54
    47
    StringPool *symbols_;
dvander@61
    48
    GlobalRoots *globalRoots_;
dvander@0
    49
dvander@27
    50
    // Root list.
dvander@28
    51
    Local<Object> *lastLocalRoot_;
dvander@29
    52
    RootScopeManager rootScopes_;
dvander@27
    53
dvander@0
    54
  public:
dvander@11
    55
    Zone();
dvander@54
    56
    ~Zone();
dvander@0
    57
    bool initialize();
dvander@0
    58
dvander@0
    59
    PoolAllocator &pool() {
dvander@0
    60
        return pool_;
dvander@0
    61
    }
dvander@0
    62
    Stack &stack() {
dvander@0
    63
        return stack_;
dvander@0
    64
    }
dvander@11
    65
    Heap &heap() {
dvander@11
    66
        return heap_;
dvander@11
    67
    }
dvander@11
    68
    Object *allocate(MapKind kind, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@11
    69
        assert(maps_[kind]);
dvander@53
    70
        Local<Map> map(this, maps_[kind]);
dvander@28
    71
        return allocate(map, bytes, tenure);
dvander@12
    72
    }
dvander@27
    73
    Object *allocate(Handle<Map> map, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@27
    74
        return heap_.allocate(map, bytes, tenure);
dvander@27
    75
    }
dvander@53
    76
    Map *getMap(MapKind kind) {
dvander@53
    77
        return maps_[kind];
dvander@53
    78
    }
dvander@12
    79
    Map *allocateMap(MapKind kind, size_t bytes, MapKind parent = MapKind_Meta);
dvander@11
    80
    TypeManager *types() const {
dvander@11
    81
        return types_;
dvander@11
    82
    }
dvander@28
    83
dvander@28
    84
    Local<Object> **lastLocalRoot() {
dvander@28
    85
        return &lastLocalRoot_;
dvander@28
    86
    }
dvander@29
    87
    Object **makeScopedRoot(Object *ptr) {
dvander@29
    88
        return rootScopes_.make(ptr);
dvander@29
    89
    }
dvander@29
    90
    RootScopeManager &rootScopes() {
dvander@29
    91
        return rootScopes_;
dvander@29
    92
    }
dvander@54
    93
    StringPool *symbols() {
dvander@54
    94
        return symbols_;
dvander@54
    95
    }
dvander@61
    96
    GlobalRoots *globalRoots() {
dvander@61
    97
        return globalRoots_;
dvander@61
    98
    }
dvander@54
    99
dvander@54
   100
    String *makeSymbol(const char *string, size_t length);
dvander@54
   101
    String *makeSymbol(const char *string);
dvander@45
   102
dvander@45
   103
    void accept(VirtualObjectVisitor *visitor);
dvander@0
   104
};
dvander@0
   105
dvander@0
   106
// In a multi-threaded system, this would be a TLS variable.
dvander@0
   107
// In the interest of simplicity, we are single-threaded for now.
dvander@60
   108
extern Zone *SingleThreadedZone;
dvander@0
   109
dvander@0
   110
static inline Zone *ZONE()
dvander@0
   111
{
dvander@60
   112
    return SingleThreadedZone;
dvander@0
   113
}
dvander@0
   114
dvander@0
   115
class LocalTop
dvander@0
   116
{
dvander@28
   117
    Top &mine_;
dvander@0
   118
    Top *prev_;
dvander@0
   119
dvander@0
   120
  public:
dvander@0
   121
    LocalTop(Top &mine)
dvander@0
   122
      : mine_(mine),
dvander@0
   123
        prev_(ZONE()->stack().top())
dvander@0
   124
    {
dvander@0
   125
        ZONE()->stack().setTop(&mine_);
dvander@0
   126
    }
dvander@0
   127
dvander@0
   128
    ~LocalTop()
dvander@0
   129
    {
dvander@0
   130
        ZONE()->stack().setTop(prev_);
dvander@0
   131
    }
dvander@0
   132
};
dvander@0
   133
dvander@28
   134
template <typename T>
dvander@28
   135
Local<T>::Local(Zone *zone, T *thing)
dvander@28
   136
  : zone_(zone),
dvander@28
   137
    thing_(thing),
dvander@28
   138
    prev_(*zone->lastLocalRoot())
dvander@28
   139
{
dvander@28
   140
    *zone->lastLocalRoot() = toRaw();
dvander@0
   141
}
dvander@0
   142
dvander@28
   143
template <typename T>
dvander@28
   144
Local<T>::~Local()
dvander@28
   145
{
dvander@28
   146
    assert(*zone_->lastLocalRoot() == toRaw());
dvander@28
   147
    *zone_->lastLocalRoot() = prev_;
dvander@28
   148
}
dvander@28
   149
dvander@29
   150
template <typename T>
dvander@53
   151
ScopedRoot<T>::ScopedRoot()
dvander@53
   152
  : thingp_(make(NULL))
dvander@53
   153
{
dvander@53
   154
}
dvander@53
   155
dvander@53
   156
template <typename T>
dvander@29
   157
ScopedRoot<T>::ScopedRoot(T *thing)
dvander@34
   158
  : thingp_(make(thing))
dvander@29
   159
{
dvander@29
   160
    // Type check that T is an Object.
dvander@29
   161
    (void)static_cast<Object *>(thing);
dvander@29
   162
}
dvander@29
   163
dvander@29
   164
template <typename T> T **
dvander@29
   165
ScopedRoot<T>::make(T *other)
dvander@29
   166
{
dvander@29
   167
    return reinterpret_cast<T **>(ZONE()->makeScopedRoot(other));
dvander@29
   168
}
dvander@29
   169
dvander@29
   170
RootScope::RootScope(Zone *zone)
dvander@60
   171
  : Ke::HandleScope(zone, zone->rootScopes().position(), *zone->rootScopes().scope())
dvander@29
   172
{
dvander@29
   173
}
dvander@29
   174
dvander@28
   175
}
dvander@28
   176
dvander@28
   177
#endif // _include_jitcraft_thread_h_