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