summaryrefslogtreecommitdiff
path: root/indra/llcommon/llsys.h
blob: 962367f69fe37a5af9af741e73d8f7017611218e (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/** 
 * @file llsys.h
 * @brief System information debugging classes.
 *
 * $LicenseInfo:firstyear=2001&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_SYS_H
#define LL_SYS_H

//
// The LLOSInfo, LLCPUInfo, and LLMemoryInfo classes are essentially
// the same, but query different machine subsystems. Here's how you
// use an LLCPUInfo object:
//
//  LLCPUInfo info;
//  LL_INFOS() << info << LL_ENDL;
//

#include "llsd.h"
#include <iosfwd>
#include <string>

class LL_COMMON_API LLOSInfo
{
public:
	LLOSInfo();
	void stream(std::ostream& s) const;

	const std::string& getOSString() const;
	const std::string& getOSStringSimple() const;

	const std::string& getOSVersionString() const;
	
	S32 mMajorVer;
	S32 mMinorVer;
	S32 mBuild;

#ifndef LL_WINDOWS
	static S32 getMaxOpenFiles();
#endif

	static U32 getProcessVirtualSizeKB();
	static U32 getProcessResidentSizeKB();
private:
	std::string mOSString;
	std::string mOSStringSimple;
	std::string mOSVersionString;
};


class LL_COMMON_API LLCPUInfo
{
public:
	LLCPUInfo();	
	void stream(std::ostream& s) const;

	std::string getCPUString() const;

	bool hasAltivec() const;
	bool hasSSE() const;
	bool hasSSE2() const;
	F64 getMHz() const;

	// Family is "AMD Duron" or "Intel Pentium Pro"
	const std::string& getFamily() const { return mFamily; }

private:
	bool mHasSSE;
	bool mHasSSE2;
	bool mHasAltivec;
	F64 mCPUMHz;
	std::string mFamily;
	std::string mCPUString;
};

//=============================================================================
//
//	CLASS		LLMemoryInfo

class LL_COMMON_API LLMemoryInfo

/*!	@brief		Class to query the memory subsystem

	@details
		Here's how you use an LLMemoryInfo:
		
		LLMemoryInfo info;
<br>	LL_INFOS() << info << LL_ENDL;
*/
{
public:
	LLMemoryInfo(); ///< Default constructor
	void stream(std::ostream& s) const;	///< output text info to s

	U32Kilobytes getPhysicalMemoryKB() const; 
	
	/*! Memory size in bytes, if total memory is >= 4GB then U32_MAX will
	**  be returned.
	*/
	U32Bytes getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes

	//get the available memory infomation in KiloBytes.
	static void getAvailableMemoryKB(U32Kilobytes& avail_physical_mem_kb, U32Kilobytes& avail_virtual_mem_kb);

	// Retrieve a map of memory statistics. The keys of the map are platform-
	// dependent. The values are in kilobytes to try to avoid integer overflow.
	LLSD getStatsMap() const;

	// Re-fetch memory data (as reported by stream() and getStatsMap()) from the
	// system. Normally this is fetched at construction time. Return (*this)
	// to permit usage of the form:
	// @code
	// LLMemoryInfo info;
	// ...
	// info.refresh().getStatsMap();
	// @endcode
	LLMemoryInfo& refresh();

private:
	// set mStatsMap
	static LLSD loadStatsMap();

	// Memory stats for getStatsMap().
	LLSD mStatsMap;
};


LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLOSInfo& info);
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLCPUInfo& info);
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info);

// gunzip srcfile into dstfile.  Returns FALSE on error.
BOOL LL_COMMON_API gunzip_file(const std::string& srcfile, const std::string& dstfile);
// gzip srcfile into dstfile.  Returns FALSE on error.
BOOL LL_COMMON_API gzip_file(const std::string& srcfile, const std::string& dstfile);

extern LL_COMMON_API LLCPUInfo gSysCPU;

#endif // LL_LLSYS_H