src/Zone.h
author David Anderson <dvander@alliedmods.net>
Tue Jan 01 20:07:09 2013 -0800 (2013-01-01)
changeset 254 cd167be62cbe
parent 251 ca99a81745fe
child 263 ba85a47ee414
permissions -rw-r--r--
Fix Linux build.
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@201
     5
 * This file is part of SourcePawn.
dvander@0
     6
 *
dvander@201
     7
 * SourcePawn 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@201
    12
 * SourcePawn 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@201
    17
 * SourcePawn. 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@69
    22
#include <stdarg.h>
dvander@0
    23
#include "PoolAllocator.h"
dvander@0
    24
#include "Stack.h"
dvander@11
    25
#include "Heap.h"
dvander@11
    26
#include "Barriers.h"
dvander@27
    27
#include "Handles.h"
dvander@69
    28
#include "Messages.h"
dvander@29
    29
#include "RootScopes.h"
dvander@45
    30
#include "VirtualObjectVisitor.h"
dvander@0
    31
dvander@59
    32
namespace ke {
dvander@0
    33
dvander@11
    34
class TypeManager;
dvander@54
    35
class String;
dvander@54
    36
class StringPool;
dvander@61
    37
class GlobalRoots;
dvander@65
    38
class ArrayMap;
dvander@69
    39
class Exception;
dvander@195
    40
class NativeTable;
dvander@251
    41
class PackageCache;
dvander@11
    42
dvander@0
    43
class Zone
dvander@0
    44
{
dvander@0
    45
    PoolAllocator pool_;
dvander@0
    46
    Stack stack_;
dvander@11
    47
    Heap heap_;
dvander@11
    48
dvander@11
    49
    // Map cache.
dvander@11
    50
    Unbarriered<Map> maps_[MapKinds_Total];
dvander@188
    51
    Unbarriered<ArrayMap> externalGenericArrayMap_;
dvander@188
    52
    Unbarriered<ArrayMap> externalCharArrayMap_;
dvander@11
    53
dvander@11
    54
    TypeManager *types_;
dvander@54
    55
    StringPool *symbols_;
dvander@61
    56
    GlobalRoots *globalRoots_;
dvander@195
    57
    NativeTable *nativeTable_;
dvander@251
    58
    PackageCache *packages_;
dvander@0
    59
dvander@27
    60
    // Root list.
dvander@28
    61
    Local<Object> *lastLocalRoot_;
dvander@29
    62
    RootScopeManager rootScopes_;
dvander@195
    63
    AutoRooted *specialRoots_;
dvander@27
    64
dvander@69
    65
    // Exception stuff.
dvander@69
    66
    bool hasPendingException_;
dvander@69
    67
    Ke::IMessageReporter *reporter_;
dvander@69
    68
dvander@195
    69
    Ke::IPublicFunctionListener *publicFunctionListener_;
dvander@195
    70
dvander@69
    71
  private:
dvander@69
    72
    Zone *thisFromCtor() {
dvander@69
    73
        return this;
dvander@69
    74
    }
dvander@69
    75
dvander@0
    76
  public:
dvander@11
    77
    Zone();
dvander@54
    78
    ~Zone();
dvander@0
    79
    bool initialize();
dvander@0
    80
dvander@0
    81
    PoolAllocator &pool() {
dvander@0
    82
        return pool_;
dvander@0
    83
    }
dvander@0
    84
    Stack &stack() {
dvander@0
    85
        return stack_;
dvander@0
    86
    }
dvander@11
    87
    Heap &heap() {
dvander@11
    88
        return heap_;
dvander@11
    89
    }
dvander@11
    90
    Object *allocate(MapKind kind, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@11
    91
        assert(maps_[kind]);
dvander@53
    92
        Local<Map> map(this, maps_[kind]);
dvander@28
    93
        return allocate(map, bytes, tenure);
dvander@12
    94
    }
dvander@27
    95
    Object *allocate(Handle<Map> map, size_t bytes, Heap::Tenure tenure = Heap::Tenure_Default) {
dvander@27
    96
        return heap_.allocate(map, bytes, tenure);
dvander@27
    97
    }
dvander@53
    98
    Map *getMap(MapKind kind) {
dvander@53
    99
        return maps_[kind];
dvander@53
   100
    }
dvander@12
   101
    Map *allocateMap(MapKind kind, size_t bytes, MapKind parent = MapKind_Meta);
dvander@65
   102
dvander@188
   103
    ArrayMap *externalGenericArrayMap() {
dvander@188
   104
        return externalGenericArrayMap_;
dvander@65
   105
    }
dvander@188
   106
    ArrayMap *externalCharArrayMap() {
dvander@188
   107
        return externalCharArrayMap_;
dvander@65
   108
    }
dvander@65
   109
dvander@11
   110
    TypeManager *types() const {
dvander@11
   111
        return types_;
dvander@11
   112
    }
dvander@195
   113
    AutoRooted **lastSpecialRoot() {
dvander@195
   114
        return &specialRoots_;
dvander@195
   115
    }
dvander@28
   116
    Local<Object> **lastLocalRoot() {
dvander@28
   117
        return &lastLocalRoot_;
dvander@28
   118
    }
dvander@29
   119
    Object **makeScopedRoot(Object *ptr) {
dvander@29
   120
        return rootScopes_.make(ptr);
dvander@29
   121
    }
dvander@29
   122
    RootScopeManager &rootScopes() {
dvander@29
   123
        return rootScopes_;
dvander@29
   124
    }
dvander@54
   125
    StringPool *symbols() {
dvander@54
   126
        return symbols_;
dvander@54
   127
    }
dvander@61
   128
    GlobalRoots *globalRoots() {
dvander@61
   129
        return globalRoots_;
dvander@61
   130
    }
dvander@195
   131
    NativeTable *nativeTable() {
dvander@195
   132
        return nativeTable_;
dvander@195
   133
    }
dvander@251
   134
    PackageCache *packages() {
dvander@251
   135
        return packages_;
dvander@251
   136
    }
dvander@54
   137
dvander@54
   138
    String *makeSymbol(const char *string, size_t length);
dvander@54
   139
    String *makeSymbol(const char *string);
dvander@45
   140
dvander@69
   141
    void reportOutOfMemory();
dvander@195
   142
    void reportAllocationOverflow();
dvander@69
   143
    void reportError(Message message, ...);
dvander@69
   144
    void reportErrorVA(Message message, va_list ap);
dvander@69
   145
    bool hasPendingException();
dvander@129
   146
    void clearPendingException();
dvander@69
   147
    void installErrorReporter(Ke::IMessageReporter *reporter);
dvander@250
   148
    Ke::IMessageReporter *errorReporter() {
dvander@250
   149
        return reporter_;
dvander@250
   150
    }
dvander@69
   151
dvander@45
   152
    void accept(VirtualObjectVisitor *visitor);
dvander@240
   153
    void sweepWeakRoots();
dvander@195
   154
dvander@195
   155
    void setPublicFunctionListener(Ke::IPublicFunctionListener *listener);
dvander@195
   156
    void registerPublic(Handle<Function> fun);
dvander@195
   157
    void unregisterPublic(Handle<Function> fun);
dvander@251
   158
dvander@251
   159
    // Helpers that report OOM.
dvander@251
   160
    void *malloc(size_t size);
dvander@251
   161
    void *realloc(void *ptr, size_t size);
dvander@0
   162
};
dvander@0
   163
dvander@0
   164
// In a multi-threaded system, this would be a TLS variable.
dvander@0
   165
// In the interest of simplicity, we are single-threaded for now.
dvander@60
   166
extern Zone *SingleThreadedZone;
dvander@0
   167
dvander@250
   168
// Exposed for the compiler.
dvander@250
   169
char *BuildErrorMessage(const char *format, va_list ap);
dvander@250
   170
void FreeErrorMessage(const char *message);
dvander@250
   171
dvander@0
   172
static inline Zone *ZONE()
dvander@0
   173
{
dvander@60
   174
    return SingleThreadedZone;
dvander@0
   175
}
dvander@0
   176
dvander@28
   177
template <typename T>
dvander@28
   178
Local<T>::Local(Zone *zone, T *thing)
dvander@28
   179
  : zone_(zone),
dvander@28
   180
    thing_(thing),
dvander@28
   181
    prev_(*zone->lastLocalRoot())
dvander@28
   182
{
dvander@28
   183
    *zone->lastLocalRoot() = toRaw();
dvander@0
   184
}
dvander@0
   185
dvander@28
   186
template <typename T>
dvander@129
   187
dvander@28
   188
Local<T>::~Local()
dvander@28
   189
{
dvander@28
   190
    assert(*zone_->lastLocalRoot() == toRaw());
dvander@28
   191
    *zone_->lastLocalRoot() = prev_;
dvander@28
   192
}
dvander@28
   193
dvander@29
   194
template <typename T>
dvander@53
   195
ScopedRoot<T>::ScopedRoot()
dvander@53
   196
  : thingp_(make(NULL))
dvander@53
   197
{
dvander@53
   198
}
dvander@53
   199
dvander@53
   200
template <typename T>
dvander@29
   201
ScopedRoot<T>::ScopedRoot(T *thing)
dvander@34
   202
  : thingp_(make(thing))
dvander@29
   203
{
dvander@29
   204
    // Type check that T is an Object.
dvander@29
   205
    (void)static_cast<Object *>(thing);
dvander@29
   206
}
dvander@29
   207
dvander@29
   208
template <typename T> T **
dvander@29
   209
ScopedRoot<T>::make(T *other)
dvander@29
   210
{
dvander@29
   211
    return reinterpret_cast<T **>(ZONE()->makeScopedRoot(other));
dvander@29
   212
}
dvander@29
   213
dvander@29
   214
RootScope::RootScope(Zone *zone)
dvander@60
   215
  : Ke::HandleScope(zone, zone->rootScopes().position(), *zone->rootScopes().scope())
dvander@29
   216
{
dvander@29
   217
}
dvander@29
   218
dvander@28
   219
}
dvander@28
   220
dvander@28
   221
#endif // _include_jitcraft_thread_h_