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