src/3rdparty/webkit/JavaScriptCore/wtf/symbian/BlockAllocatorSymbian.h
changeset 22 79de32ba3296
equal deleted inserted replaced
19:fcece45ef507 22:79de32ba3296
       
     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