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