QtScript/JSC on Symbian: Enhanced memory allocator for Collector heap
[qt:qt.git] / src / 3rdparty / javascriptcore / JavaScriptCore / 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