summaryrefslogtreecommitdiff
path: root/indra/llcommon/llmemtype.h
blob: a101f35628231699a0812f7581ee520caa93a383 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/** 
 * @file llmemtype.h
 * @brief Runtime memory usage debugging utilities.
 *
 * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#ifndef LL_MEMTYPE_H
#define LL_MEMTYPE_H

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

class LLMemType;

extern void* ll_allocate (size_t size);
extern void ll_release (void *p);

#define MEM_TRACK_MEM 0
#define MEM_TRACK_TYPE (1 && MEM_TRACK_MEM)

#if MEM_TRACK_TYPE
#define MEM_DUMP_DATA 1
#define MEM_TYPE_NEW(T) \
static void* operator new(size_t s) { LLMemType mt(T); return ll_allocate(s); } \
static void  operator delete(void* p) { ll_release(p); }

#else
#define MEM_TYPE_NEW(T)
#endif // MEM_TRACK_TYPE


//----------------------------------------------------------------------------

class LLMemType
{
public:
	// Also update sTypeDesc in llmemory.cpp
	enum EMemType
	{
		MTYPE_INIT,
		MTYPE_STARTUP,
		MTYPE_MAIN,

		MTYPE_IMAGEBASE,
		MTYPE_IMAGERAW,
		MTYPE_IMAGEFORMATTED,
		
		MTYPE_APPFMTIMAGE,
		MTYPE_APPRAWIMAGE,
		MTYPE_APPAUXRAWIMAGE,
		
		MTYPE_DRAWABLE,
		MTYPE_OBJECT,
		MTYPE_VERTEX_DATA,
		MTYPE_SPACE_PARTITION,
		MTYPE_PIPELINE,
		MTYPE_AVATAR,
		MTYPE_PARTICLES,
		MTYPE_REGIONS,
		MTYPE_INVENTORY,
		MTYPE_ANIMATION,
		MTYPE_NETWORK,
		MTYPE_PHYSICS,
		MTYPE_INTERESTLIST,
		
		MTYPE_SCRIPT,
		MTYPE_SCRIPT_RUN,
		MTYPE_SCRIPT_BYTECODE,
		
		MTYPE_IO_PUMP,
		MTYPE_IO_TCP,
		MTYPE_IO_BUFFER,
		MTYPE_IO_HTTP_SERVER,
		MTYPE_IO_SD_SERVER,
		MTYPE_IO_SD_CLIENT,
		MTYPE_IO_URL_REQUEST,

		MTYPE_TEMP1,
		MTYPE_TEMP2,
		MTYPE_TEMP3,
		MTYPE_TEMP4,
		MTYPE_TEMP5,
		MTYPE_TEMP6,
		MTYPE_TEMP7,
		MTYPE_TEMP8,
		MTYPE_TEMP9,

		MTYPE_OTHER, // Special, used by display code
		
		MTYPE_NUM_TYPES
	};
	enum { MTYPE_MAX_DEPTH = 64 };
	
public:
	LLMemType(EMemType type)
	{
#if MEM_TRACK_TYPE
		if (type < 0 || type >= MTYPE_NUM_TYPES)
			llerrs << "LLMemType error" << llendl;
		if (sCurDepth < 0 || sCurDepth >= MTYPE_MAX_DEPTH)
			llerrs << "LLMemType error" << llendl;
		sType[sCurDepth] = sCurType;
		sCurDepth++;
		sCurType = type;
#endif
	}
	~LLMemType()
	{
#if MEM_TRACK_TYPE
		sCurDepth--;
		sCurType = sType[sCurDepth];
#endif
	}

	static void reset();
	static void printMem();
	
public:
#if MEM_TRACK_TYPE
	static S32 sCurDepth;
	static S32 sCurType;
	static S32 sType[MTYPE_MAX_DEPTH];
	static S32 sMemCount[MTYPE_NUM_TYPES];
	static S32 sMaxMemCount[MTYPE_NUM_TYPES];
	static S32 sNewCount[MTYPE_NUM_TYPES];
	static S32 sOverheadMem;
	static const char* sTypeDesc[MTYPE_NUM_TYPES];
#endif
	static S32 sTotalMem;
	static S32 sMaxTotalMem;
};

//----------------------------------------------------------------------------

#endif