181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/*
281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without
581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions
681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * are met:
781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1.  Redistributions of source code must retain the above copyright
981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     notice, this list of conditions and the following disclaimer.
1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     notice, this list of conditions and the following disclaimer in the
1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     documentation and/or other materials provided with the distribution.
1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     its contributors may be used to endorse or promote products derived
1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     from this software without specific prior written permission.
1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */
2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#ifndef PageAllocatorSymbian_h
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define PageAllocatorSymbian_h
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <e32std.h>
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/Bitmap.h>
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WTF {
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochsize_t pageSize();
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Convenience wrapper around an RChunk
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass SymbianChunk : public RChunk {
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic:
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SymbianChunk(TInt handle)
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        SetHandle(handle);
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // prevent kernel calls by caching these
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_base = reinterpret_cast<char*>(Base());
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_maxSize = MaxSize();
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ~SymbianChunk()
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Decommit(0, m_maxSize);
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Close();
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // checks if address is in chunk's virtual address space
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool contains(const void* address) const
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return (static_cast<const char*>(address) >= m_base && static_cast<const char*>(address) < (m_base + m_maxSize));
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    char* m_base;
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    size_t m_maxSize;
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Size of the large up-front reservation
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if defined(__WINS__)
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Emulator has limited virtual address space
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst size_t largeReservationSize = 96*1024*1024;
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#else
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// HW has plenty of virtual addresses
7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst size_t largeReservationSize = 256*1024*1024;
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass PageAllocatorSymbian {
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic:
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PageAllocatorSymbian();
8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ~PageAllocatorSymbian();
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void* reserve(size_t);
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void release(void*, size_t);
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool commit(void*, size_t);
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool decommit(void*, size_t);
8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool contains(const void*) const;
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate:
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static const size_t m_pageSize = 4096;
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SymbianChunk* m_chunk;
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Bitmap<largeReservationSize / m_pageSize> m_map;
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WTF
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif // PageAllocatorSymbian_h
10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
101