src/GlobalRoots.cpp
author David Anderson <danderson@mozilla.com>
Wed Jul 25 01:30:33 2012 -0700 (2012-07-25)
changeset 92 e3974e7360e9
parent 86 32ad0523b309
child 127 74ad30a6214a
permissions -rw-r--r--
Add GCC/Linux support.
dvander@61
     1
/*
dvander@61
     2
 * Copyright (C) 2004-2012 David Anderson
dvander@61
     3
 *
dvander@61
     4
 * This file is part of SourcePawn.
dvander@61
     5
 *
dvander@61
     6
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@61
     7
 * the terms of the GNU General Public License as published by the Free
dvander@61
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@61
     9
 * any later version.
dvander@61
    10
 * 
dvander@61
    11
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@61
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@61
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@61
    14
 *
dvander@61
    15
 * You should have received a copy of the GNU General Public License along with
dvander@61
    16
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@61
    17
 */
dvander@61
    18
#include "GlobalRoots.h"
dvander@61
    19
#include "Zone.h"
danderson@92
    20
#include "Spaces-inl.h"
danderson@92
    21
#include "Heap-inl.h"
dvander@61
    22
dvander@61
    23
using namespace ke;
dvander@61
    24
dvander@61
    25
GlobalRoots::GlobalRoots(Zone *zone)
dvander@61
    26
  : zone_(zone)
dvander@61
    27
{
dvander@61
    28
}
dvander@61
    29
dvander@61
    30
GlobalRoots::~GlobalRoots()
dvander@61
    31
{
dvander@61
    32
    InlineList<HeapRoot>::iterator iter = roots_.begin();
dvander@61
    33
    while (iter != roots_.end()) {
dvander@65
    34
		HeapRoot *root = *iter;
dvander@61
    35
        iter = roots_.erase(iter);
dvander@65
    36
		delete root;
dvander@61
    37
    }
dvander@61
    38
}
dvander@61
    39
dvander@61
    40
bool
dvander@61
    41
GlobalRoots::initialize()
dvander@61
    42
{
dvander@61
    43
    return true;
dvander@61
    44
}
dvander@61
    45
dvander@61
    46
void
dvander@61
    47
GlobalRoots::accept(VirtualObjectVisitor *visitor)
dvander@61
    48
{
dvander@61
    49
    for (InlineList<HeapRoot>::iterator iter = roots_.begin(); iter != roots_.end(); iter++)
dvander@61
    50
        visitor->visit(&iter->obj);
dvander@61
    51
}
dvander@61
    52
dvander@61
    53
HeapRoot *
dvander@61
    54
GlobalRoots::create(Handle<Object> obj)
dvander@61
    55
{
dvander@61
    56
    HeapRoot *root = new HeapRoot();
dvander@69
    57
    if (!root) {
dvander@69
    58
        ZONE()->reportOutOfMemory();
dvander@61
    59
        return NULL;
dvander@69
    60
    }
dvander@61
    61
dvander@61
    62
    root->obj = obj;
dvander@65
    63
    root->refcount = 1;
dvander@61
    64
dvander@61
    65
    roots_.append(root);
dvander@61
    66
    return root;
dvander@61
    67
}
dvander@61
    68
dvander@61
    69
void
dvander@61
    70
GlobalRoots::incref(HeapRoot *root)
dvander@61
    71
{
dvander@61
    72
    root->refcount++;
dvander@61
    73
}
dvander@61
    74
dvander@61
    75
void
dvander@61
    76
GlobalRoots::decref(HeapRoot *root)
dvander@61
    77
{
dvander@61
    78
    assert(root->refcount > 0);
dvander@61
    79
    if (--root->refcount == 0) {
dvander@61
    80
        roots_.remove(root);
dvander@61
    81
        delete root;
dvander@61
    82
    }
dvander@61
    83
}