]> git.saurik.com Git - apple/javascriptcore.git/blob - wtf/symbian/BlockAllocatorSymbian.h
21422f6208c555044c66f62ad868b37569ffced3
[apple/javascriptcore.git] / wtf / symbian / BlockAllocatorSymbian.h
1 /*
2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #ifndef BlockAllocatorSymbian_h
30 #define BlockAllocatorSymbian_h
31
32 #include <e32cmn.h>
33 #include <e32std.h>
34 #include <hal.h>
35
36
37 #define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x));
38 #define SYMBIAN_FREERAM(x) (HAL::Get(HALData::EMemoryRAMFree, x));
39 #define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) & ~(multipleof - 1) )
40
41 // Set sane defaults if -D<flagname=value> wasn't provided via compiler args
42 #ifndef JSCCOLLECTOR_VIRTUALMEM_RESERVATION
43 #if defined(__WINS__)
44 // Emulator has limited virtual address space
45 #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (4*1024*1024)
46 #else
47 // HW has plenty of virtual addresses
48 #define JSCCOLLECTOR_VIRTUALMEM_RESERVATION (128*1024*1024)
49 #endif
50 #endif
51
52 namespace WTF {
53
54 /**
55 * Allocates contiguous region of size blockSize with blockSize-aligned address.
56 * blockSize must be a multiple of system page size (typically 4K on Symbian/ARM)
57 *
58 * @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes).
59 * @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned.
60 */
61 class AlignedBlockAllocator {
62 public:
63 AlignedBlockAllocator(TUint32 reservationSize, TUint32 blockSize);
64 ~AlignedBlockAllocator();
65 void destroy();
66 void* alloc();
67 void free(void* data);
68
69 private:
70 RChunk m_chunk; // Symbian chunk that lets us reserve/commit/decommit
71 TUint m_offset; // offset of first committed region from base
72 TInt m_pageSize; // cached value of system page size, typically 4K on Symbian
73 TUint32 m_reservation;
74 TUint32 m_blockSize;
75
76 // Tracks comitted/decommitted state of a blockSize region
77 struct {
78
79 TUint32 *bits; // array of bit flags
80 TUint32 numBits; // number of regions to keep track of
81
82 bool get(TUint32 n) const
83 {
84 return !!(bits[n >> 5] & (1 << (n & 0x1F)));
85 }
86
87 void set(TUint32 n)
88 {
89 bits[n >> 5] |= (1 << (n & 0x1F));
90 }
91
92 void clear(TUint32 n)
93 {
94 bits[n >> 5] &= ~(1 << (n & 0x1F));
95 }
96
97 void clearAll()
98 {
99 for (TUint32 i = 0; i < numBits; i++)
100 clear(i);
101 }
102
103 TInt findFree() const
104 {
105 for (TUint32 i = 0; i < numBits; i++) {
106 if (!get(i))
107 return i;
108 }
109 return -1;
110 }
111
112 } m_map;
113
114 };
115
116 }
117
118 #endif // end of BlockAllocatorSymbian_h
119
120