1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is a simple allocator based on the windows heap. 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern "C" { 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottHANDLE win_heap; 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool win_heap_init(bool use_lfh) { 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott win_heap = HeapCreate(0, 0, 0); 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (win_heap == NULL) 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (use_lfh) { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ULONG enable_lfh = 2; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeapSetInformation(win_heap, HeapCompatibilityInformation, 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &enable_lfh, sizeof(enable_lfh)); 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // NOTE: Setting LFH may fail. Vista already has it enabled. 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // And under the debugger, it won't use LFH. So we 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ignore any errors. 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid* win_heap_malloc(size_t size) { 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return HeapAlloc(win_heap, 0, size); 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid win_heap_free(void* size) { 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HeapFree(win_heap, 0, size); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid* win_heap_realloc(void* ptr, size_t size) { 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!ptr) 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return win_heap_malloc(size); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!size) { 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott win_heap_free(ptr); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return NULL; 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return HeapReAlloc(win_heap, 0, ptr, size); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t win_heap_msize(void* ptr) { 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return HeapSize(win_heap, 0, ptr); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // extern "C" 51