1 #include "stdafx.h"
2 #include "MASTER.h"
3 
4 #define TECPLOTENGINEMODULE
5 
6 /*
7 ******************************************************************
8 ******************************************************************
9 *******                                                   ********
10 ******  (C) 1988-2010 Tecplot, Inc.                        *******
11 *******                                                   ********
12 ******************************************************************
13 ******************************************************************
14 */
15 
16 #define ALLOCMODULE
17 #include "GLOBAL.h"
18 #include "ALLOC.h"
19 #include "TASSERT.h"
20 #if defined TECPLOTKERNEL
21 /* CORE SOURCE CODE REMOVED */
22 #endif
23 
24 #if defined TRACK_MEMORY_USAGE
25 static size_t memInUse = 0;
26 static size_t memTotalHighMark = 0;
27 static size_t memCurrentHighMark = 0;
28 static size_t memSavedHighMark = 0;
29 Mutex_pa memMutex;
30 
initMemoryUsageTracking(void)31 void initMemoryUsageTracking(void)
32 {
33     REQUIRE(!Thread_ThreadingIsInitialized());
34     Thread_InitMutex(&memMutex);
35 }
36 
cleanUpMemoryUsageTracking(void)37 void cleanUpMemoryUsageTracking(void)
38 {
39     REQUIRE(!Thread_ThreadingIsInitialized());
40     Thread_FreeMutex(&memMutex);
41 }
42 
trackMemoryClearHighMark(void)43 void trackMemoryClearHighMark(void)
44 {
45     memCurrentHighMark = memInUse;
46 }
47 
trackMemorySaveHighMark(void)48 void trackMemorySaveHighMark(void)
49 {
50     memSavedHighMark = memCurrentHighMark;
51 }
52 
trackMemoryAlloc(size_t size)53 void trackMemoryAlloc(size_t size)
54 {
55     REQUIRE(memInUse >= 0);
56 
57     if (Thread_ThreadingIsInitialized())
58         Thread_LockMutex(memMutex);
59 
60     memInUse += size;
61     if (memInUse > memTotalHighMark)
62         memTotalHighMark = memInUse;
63     if (memInUse > memCurrentHighMark)
64         memCurrentHighMark = memInUse;
65 
66     if (Thread_ThreadingIsInitialized())
67         Thread_UnlockMutex(memMutex);
68 }
69 
trackMemoryFree(size_t size)70 void trackMemoryFree(size_t size)
71 {
72     if (Thread_ThreadingIsInitialized())
73         Thread_LockMutex(memMutex);
74 
75     memInUse -= size;
76 
77     if (Thread_ThreadingIsInitialized())
78         Thread_UnlockMutex(memMutex);
79 
80     ENSURE(memInUse >= 0);
81 }
82 
getMemoryUsage(size_t * memoryInUse,size_t * memoryCurrentHighMark,size_t * memorySavedHighMark,size_t * memoryTotalHighMark)83 void getMemoryUsage(size_t* memoryInUse,
84                     size_t* memoryCurrentHighMark,
85                     size_t* memorySavedHighMark,
86                     size_t* memoryTotalHighMark)
87 {
88     REQUIRE(VALID_REF_OR_NULL(memoryInUse));
89     REQUIRE(VALID_REF_OR_NULL(memoryCurrentHighMark));
90     REQUIRE(VALID_REF_OR_NULL(memorySavedHighMark));
91     REQUIRE(VALID_REF_OR_NULL(memoryTotalHighMark));
92     if (memoryInUse != NULL)
93         *memoryInUse = memInUse;
94     if (memoryCurrentHighMark != NULL)
95         *memoryCurrentHighMark = memCurrentHighMark;
96     if (memorySavedHighMark != NULL)
97         *memorySavedHighMark = memSavedHighMark;
98     if (memoryTotalHighMark != NULL)
99         *memoryTotalHighMark = memTotalHighMark;
100 }
101 #endif
102 
103 #if defined MSWIN && defined ALLOC_HEAP
104 #define HEAPMIN 512
105 #endif
106 
107 #if defined MSWIN && defined ALLOC_HEAP
108 /**
109  */
MSWinAlloc(DWORD nSize)110 void *MSWinAlloc(DWORD nSize)
111 {
112     long *pMem = NULL;
113     if (nSize < HEAPMIN)
114         pMem = (long *)malloc(sizeof(long) + nSize);
115     else
116         pMem = (long *)HeapAlloc(GetProcessHeap(), NULL, sizeof(long) + nSize);
117     if (pMem)
118         pMem[0] = nSize;
119     return (void *)&(pMem[1]);
120 }
121 #endif
122 
123 #if defined MSWIN && defined ALLOC_HEAP
124 /**
125  */
MSWinFree(void * pMem)126 void MSWinFree(void *pMem)
127 {
128     REQUIRE(VALID_REF(pMem));
129     if (pMem)
130     {
131         long *pMemLong = &(((long *)pMem)[-1]);
132         if (pMemLong[0] < HEAPMIN)
133             free((void *)pMemLong);
134         else
135             HeapFree(GetProcessHeap(), NULL, (void *)pMemLong);
136     }
137 }
138 #endif
139