~ubuntu-branches/ubuntu/maverick/webkit/maverick

« back to all changes in this revision

Viewing changes to WebCore/rendering/RenderArena.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Mike Hommey
  • Date: 2007-08-19 15:54:12 UTC
  • Revision ID: james.westby@ubuntu.com-20070819155412-uxxg1h9plpghmtbi
Tags: upstream-0~svn25144
ImportĀ upstreamĀ versionĀ 0~svn25144

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2003 Apple Computer, Inc.
 
3
 *
 
4
 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
 
5
 *
 
6
 * This library is free software; you can redistribute it and/or
 
7
 * modify it under the terms of the GNU Lesser General Public
 
8
 * License as published by the Free Software Foundation; either
 
9
 * version 2.1 of the License, or (at your option) any later version.
 
10
 *
 
11
 * This library is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
 * Lesser General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU Lesser General Public
 
17
 * License along with this library; if not, write to the Free Software
 
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
19
 *
 
20
 * Alternatively, the contents of this file may be used under the terms
 
21
 * of either the Mozilla Public License Version 1.1, found at
 
22
 * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
 
23
 * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
 
24
 * (the "GPL"), in which case the provisions of the MPL or the GPL are
 
25
 * applicable instead of those above.  If you wish to allow use of your
 
26
 * version of this file only under the terms of one of those two
 
27
 * licenses (the MPL or the GPL) and not to allow others to use your
 
28
 * version of this file under the LGPL, indicate your decision by
 
29
 * deletingthe provisions above and replace them with the notice and
 
30
 * other provisions required by the MPL or the GPL, as the case may be.
 
31
 * If you do not delete the provisions above, a recipient may use your
 
32
 * version of this file under any of the LGPL, the MPL or the GPL.
 
33
 */
 
34
 
 
35
#include "config.h"
 
36
#include "RenderArena.h"
 
37
 
 
38
#include <stdlib.h>
 
39
#include <string.h>
 
40
#include <wtf/Assertions.h>
 
41
 
 
42
#define ROUNDUP(x,y) ((((x)+((y)-1))/(y))*(y))
 
43
 
 
44
namespace WebCore {
 
45
 
 
46
#ifndef NDEBUG
 
47
 
 
48
const int signature = 0xDBA00AEA;
 
49
const int signatureDead = 0xDBA00AED;
 
50
 
 
51
typedef struct {
 
52
    RenderArena* arena;
 
53
    size_t size;
 
54
    int signature;
 
55
} RenderArenaDebugHeader;
 
56
 
 
57
#endif
 
58
 
 
59
RenderArena::RenderArena(unsigned arenaSize)
 
60
{
 
61
    // Initialize the arena pool
 
62
    INIT_ARENA_POOL(&m_pool, "RenderArena", arenaSize);
 
63
 
 
64
    // Zero out the recyclers array
 
65
    memset(m_recyclers, 0, sizeof(m_recyclers));
 
66
}
 
67
 
 
68
RenderArena::~RenderArena()
 
69
{
 
70
    FinishArenaPool(&m_pool);
 
71
}
 
72
 
 
73
void* RenderArena::allocate(size_t size)
 
74
{
 
75
#ifndef NDEBUG
 
76
    // Use standard malloc so that memory debugging tools work.
 
77
    ASSERT(this);
 
78
    void* block = ::malloc(sizeof(RenderArenaDebugHeader) + size);
 
79
    RenderArenaDebugHeader* header = (RenderArenaDebugHeader*)block;
 
80
    header->arena = this;
 
81
    header->size = size;
 
82
    header->signature = signature;
 
83
    return header + 1;
 
84
#else
 
85
    void* result = 0;
 
86
 
 
87
    // Ensure we have correct alignment for pointers.  Important for Tru64
 
88
    size = ROUNDUP(size, sizeof(void*));
 
89
 
 
90
    // Check recyclers first
 
91
    if (size < gMaxRecycledSize) {
 
92
        const int index = size >> 2;
 
93
 
 
94
        result = m_recyclers[index];
 
95
        if (result) {
 
96
            // Need to move to the next object
 
97
            void* next = *((void**)result);
 
98
            m_recyclers[index] = next;
 
99
        }
 
100
    }
 
101
 
 
102
    if (!result) {
 
103
        // Allocate a new chunk from the arena
 
104
        ARENA_ALLOCATE(result, &m_pool, size);
 
105
    }
 
106
 
 
107
    return result;
 
108
#endif
 
109
}
 
110
 
 
111
void RenderArena::free(size_t size, void* ptr)
 
112
{
 
113
#ifndef NDEBUG
 
114
    // Use standard free so that memory debugging tools work.
 
115
    RenderArenaDebugHeader* header = (RenderArenaDebugHeader*)ptr - 1;
 
116
    ASSERT(header->signature == signature);
 
117
    ASSERT(header->size == size);
 
118
    ASSERT(header->arena == this);
 
119
    header->signature = signatureDead;
 
120
    ::free(header);
 
121
#else
 
122
    // Ensure we have correct alignment for pointers.  Important for Tru64
 
123
    size = ROUNDUP(size, sizeof(void*));
 
124
 
 
125
    // See if it's a size that we recycle
 
126
    if (size < gMaxRecycledSize) {
 
127
        const int index = size >> 2;
 
128
        void* currentTop = m_recyclers[index];
 
129
        m_recyclers[index] = ptr;
 
130
        *((void**)ptr) = currentTop;
 
131
    }
 
132
#endif
 
133
}
 
134
 
 
135
} // namespace WebCore