10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008-2009 Torch Mobile Inc.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * This library is free software; you can redistribute it and/or
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modify it under the terms of the GNU Library General Public
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * License as published by the Free Software Foundation; either
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * version 2 of the License, or (at your option) any later version.
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * This library is distributed in the hope that it will be useful,
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Library General Public License for more details.
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * You should have received a copy of the GNU Library General Public License
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Boston, MA 02110-1301, USA.
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#pragma once
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <winbase.h>
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtypedef struct HBITMAP__* HBITMAP;
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtypedef struct HDC__* HDC;
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtypedef void *HANDLE;
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtypedef struct tagBITMAPINFO BITMAPINFO;
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WTF {
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MemoryManager {
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MemoryManager();
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ~MemoryManager();
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool allocationCanFail() const { return m_allocationCanFail; }
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void setAllocationCanFail(bool c) { m_allocationCanFail = c; }
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static HBITMAP createCompatibleBitmap(HDC hdc, int width, int height);
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static HBITMAP createDIBSection(const BITMAPINFO* pbmi, void** ppvBits);
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void* m_malloc(size_t size);
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void* m_calloc(size_t num, size_t size);
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void* m_realloc(void* p, size_t size);
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void m_free(void*);
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static bool resizeMemory(void* p, size_t newSize);
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void* allocate64kBlock();
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void free64kBlock(void*);
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static bool onIdle(DWORD& timeLimitMs);
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static LPVOID virtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect);
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static BOOL virtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType);
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        friend MemoryManager* memoryManager();
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool m_allocationCanFail;
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MemoryManager* memoryManager();
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MemoryAllocationCanFail {
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MemoryAllocationCanFail() : m_old(memoryManager()->allocationCanFail()) { memoryManager()->setAllocationCanFail(true); }
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ~MemoryAllocationCanFail() { memoryManager()->setAllocationCanFail(m_old); }
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool m_old;
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MemoryAllocationCannotFail {
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MemoryAllocationCannotFail() : m_old(memoryManager()->allocationCanFail()) { memoryManager()->setAllocationCanFail(false); }
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ~MemoryAllocationCannotFail() { memoryManager()->setAllocationCanFail(m_old); }
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool m_old;
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing WTF::MemoryManager;
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing WTF::memoryManager;
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing WTF::MemoryAllocationCanFail;
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing WTF::MemoryAllocationCannotFail;
81