Home | History | Annotate | Download | only in wtf
      1 /*
      2  * Copyright (C) 2011 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 PageAllocatorSymbian_h
     30 #define PageAllocatorSymbian_h
     31 
     32 #include <e32std.h>
     33 #include <wtf/Bitmap.h>
     34 
     35 namespace WTF {
     36 
     37 size_t pageSize();
     38 
     39 // Convenience wrapper around an RChunk
     40 class SymbianChunk : public RChunk {
     41 
     42 public:
     43     SymbianChunk(TInt handle)
     44     {
     45         SetHandle(handle);
     46         // prevent kernel calls by caching these
     47         m_base = reinterpret_cast<char*>(Base());
     48         m_maxSize = MaxSize();
     49     }
     50 
     51     ~SymbianChunk()
     52     {
     53         Decommit(0, m_maxSize);
     54         Close();
     55     }
     56 
     57     // checks if address is in chunk's virtual address space
     58     bool contains(const void* address) const
     59     {
     60         return (static_cast<const char*>(address) >= m_base && static_cast<const char*>(address) < (m_base + m_maxSize));
     61     }
     62 
     63     char* m_base;
     64     size_t m_maxSize;
     65 
     66 };
     67 
     68 // Size of the large up-front reservation
     69 #if defined(__WINS__)
     70 // Emulator has limited virtual address space
     71 const size_t largeReservationSize = 96*1024*1024;
     72 #else
     73 // HW has plenty of virtual addresses
     74 const size_t largeReservationSize = 256*1024*1024;
     75 #endif
     76 
     77 class PageAllocatorSymbian {
     78 
     79 public:
     80     PageAllocatorSymbian();
     81     ~PageAllocatorSymbian();
     82 
     83     void* reserve(size_t);
     84     void release(void*, size_t);
     85     bool commit(void*, size_t);
     86     bool decommit(void*, size_t);
     87 
     88     bool contains(const void*) const;
     89 
     90 private:
     91     static const size_t m_pageSize = 4096;
     92     SymbianChunk* m_chunk;
     93     Bitmap<largeReservationSize / m_pageSize> m_map;
     94 
     95 };
     96 
     97 } // namespace WTF
     98 
     99 #endif // PageAllocatorSymbian_h
    100 
    101