0024023: Revamp the OCCT Handle -- general
[occt.git] / src / NCollection / NCollection_WinHeapAllocator.cxx
1 // Created on: 22.07.11
2 // Created by: Kirill GAVRILOV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <NCollection_WinHeapAllocator.hxx>
17 #include <Standard_OutOfMemory.hxx>
18
19 #if(defined(_WIN32) || defined(__WIN32__))
20   #include <windows.h>
21 #endif
22
23 //=======================================================================
24 //function : NCollection_WinHeapAllocator
25 //purpose  : Main constructor
26 //=======================================================================
27 NCollection_WinHeapAllocator::NCollection_WinHeapAllocator
28                                         (const size_t theInitSizeBytes)
29 : NCollection_BaseAllocator(),
30 #if(defined(_WIN32) || defined(__WIN32__))
31   myHeapH (HeapCreate (0, theInitSizeBytes, 0)),
32 #endif
33   myToZeroMemory (Standard_False)
34 {
35 #if(defined(_WIN32) || defined(__WIN32__))
36   // activate LHF to improve small size allocations
37   ULONG aHeapInfo = 2;
38   HeapSetInformation (myHeapH, HeapCompatibilityInformation,
39                       &aHeapInfo, sizeof(aHeapInfo));
40 #endif
41 }
42
43 //=======================================================================
44 //function : ~NCollection_WinHeapAllocator
45 //purpose  : Destructor
46 //=======================================================================
47 NCollection_WinHeapAllocator::~NCollection_WinHeapAllocator()
48 {
49 #if(defined(_WIN32) || defined(__WIN32__))
50   HeapDestroy (myHeapH);
51 #endif
52 }
53
54
55 //=======================================================================
56 //function : Allocate
57 //purpose  :
58 //=======================================================================
59 void* NCollection_WinHeapAllocator::Allocate (const Standard_Size theSize)
60 {
61   // the size is rounded up to word size.
62   const Standard_Size aRoundSize = (theSize + 3) & ~0x3;
63 #if(defined(_WIN32) || defined(__WIN32__))
64   void* aResult = HeapAlloc (myHeapH, myToZeroMemory ? HEAP_ZERO_MEMORY : 0,
65                              aRoundSize);
66 #else
67   void* aResult = malloc (aRoundSize);
68 #endif
69   if (aResult == NULL)
70   {
71     char aBuf[128];
72     Sprintf (aBuf, "Failed to allocate " PRIuPTR " bytes in local dynamic heap", theSize);
73     Standard_OutOfMemory::Raise (aBuf);
74   }
75   return aResult;
76 }
77
78 //=======================================================================
79 //function : Free
80 //purpose  :
81 //=======================================================================
82 void NCollection_WinHeapAllocator::Free (void* theAddress)
83 {
84   if (theAddress != NULL)
85   {
86   #if(defined(_WIN32) || defined(__WIN32__))
87     HeapFree (myHeapH, 0, theAddress);
88   #else
89     free (theAddress);
90   #endif
91   }
92 }