summaryrefslogtreecommitdiff
path: root/indra/llcommon/llsys.h
blob: 3307285934558529b7e9fc0274c0e769a2c7f44e (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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/**
 * @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 "llsingleton.h"
#include <iosfwd>
#include <string>

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

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

    const std::string& getOSVersionString() const;

    const S32 getOSBitness() const;

    S32 mMajorVer;
    S32 mMinorVer;
    S32 mBuild;

#ifndef LL_WINDOWS
    static long getMaxOpenFiles();
#endif
    static bool is64Bit();

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


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

    std::string getCPUString() const;
    const LLSD& getSSEVersions() const;

    bool hasAltivec() const;
    bool hasSSE() const;
    bool hasSSE2() const;
    bool hasSSE3() const;
    bool hasSSE3S() const;
    bool hasSSE41() const;
    bool hasSSE42() const;
    bool hasSSE4a() 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 mHasSSE3;
    bool mHasSSE3S;
    bool mHasSSE41;
    bool mHasSSE42;
    bool mHasSSE4a;
    bool mHasAltivec;
    F64 mCPUMHz;
    std::string mFamily;
    std::string mCPUString;
    LLSD mSSEVersions;
};

//=============================================================================
//
//  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;
#if LL_DARWIN || __FreeBSD__
    static U32Kilobytes getHardwareMemSize(); // Because some Mac linkers won't let us reference extern gSysMemory from a different lib.
#endif

    //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