OpenShot Audio Library | OpenShotAudio 0.3.2
Loading...
Searching...
No Matches
juce_SystemStats.cpp
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2017 - ROLI Ltd.
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
27{
28 // Some basic tests, to keep an eye on things and make sure these types work ok
29 // on all platforms. Let me know if any of these assertions fail on your system!
30 static_assert (sizeof (pointer_sized_int) == sizeof (void*), "Basic sanity test failed: please report!");
31 static_assert (sizeof (int8) == 1, "Basic sanity test failed: please report!");
32 static_assert (sizeof (uint8) == 1, "Basic sanity test failed: please report!");
33 static_assert (sizeof (int16) == 2, "Basic sanity test failed: please report!");
34 static_assert (sizeof (uint16) == 2, "Basic sanity test failed: please report!");
35 static_assert (sizeof (int32) == 4, "Basic sanity test failed: please report!");
36 static_assert (sizeof (uint32) == 4, "Basic sanity test failed: please report!");
37 static_assert (sizeof (int64) == 8, "Basic sanity test failed: please report!");
38 static_assert (sizeof (uint64) == 8, "Basic sanity test failed: please report!");
39
40 return "JUCE v" JUCE_STRINGIFY(JUCE_MAJOR_VERSION)
41 "." JUCE_STRINGIFY(JUCE_MINOR_VERSION)
42 "." JUCE_STRINGIFY(JUCE_BUILDNUMBER);
43}
44
45#if JUCE_ANDROID && ! defined (JUCE_DISABLE_JUCE_VERSION_PRINTING)
46 #define JUCE_DISABLE_JUCE_VERSION_PRINTING 1
47#endif
48
49#if JUCE_DEBUG && ! JUCE_DISABLE_JUCE_VERSION_PRINTING
51 {
53 {
55 }
56 };
57
58 static JuceVersionPrinter juceVersionPrinter;
59#endif
60
62{
64
65 #if JUCE_WINDOWS
66 File f (File::getSpecialLocation (File::windowsSystemDirectory));
67 #else
68 File f ("~");
69 #endif
70 if (auto num = f.getFileIdentifier())
71 {
73 }
74 else
75 {
76 for (auto& address : MACAddress::getAllAddresses())
77 ids.add (address.toString());
78 }
79
80 jassert (! ids.isEmpty()); // Failed to create any IDs!
81 return ids;
82}
83
84//==============================================================================
85struct CPUInformation
86{
87 CPUInformation() noexcept { initialise(); }
88
89 void initialise() noexcept;
90
91 int numLogicalCPUs = 0, numPhysicalCPUs = 0;
92
93 bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false,
94 has3DNow = false, hasFMA3 = false, hasFMA4 = false, hasSSSE3 = false,
95 hasSSE41 = false, hasSSE42 = false, hasAVX = false, hasAVX2 = false,
96 hasAVX512F = false, hasAVX512BW = false, hasAVX512CD = false,
97 hasAVX512DQ = false, hasAVX512ER = false, hasAVX512IFMA = false,
98 hasAVX512PF = false, hasAVX512VBMI = false, hasAVX512VL = false,
99 hasAVX512VPOPCNTDQ = false,
100 hasNeon = false;
101};
102
103static const CPUInformation& getCPUInformation() noexcept
104{
105 static CPUInformation info;
106 return info;
107}
108
109int SystemStats::getNumCpus() noexcept { return getCPUInformation().numLogicalCPUs; }
110int SystemStats::getNumPhysicalCpus() noexcept { return getCPUInformation().numPhysicalCPUs; }
111bool SystemStats::hasMMX() noexcept { return getCPUInformation().hasMMX; }
112bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; }
113bool SystemStats::hasFMA3() noexcept { return getCPUInformation().hasFMA3; }
114bool SystemStats::hasFMA4() noexcept { return getCPUInformation().hasFMA4; }
115bool SystemStats::hasSSE() noexcept { return getCPUInformation().hasSSE; }
116bool SystemStats::hasSSE2() noexcept { return getCPUInformation().hasSSE2; }
117bool SystemStats::hasSSE3() noexcept { return getCPUInformation().hasSSE3; }
118bool SystemStats::hasSSSE3() noexcept { return getCPUInformation().hasSSSE3; }
119bool SystemStats::hasSSE41() noexcept { return getCPUInformation().hasSSE41; }
120bool SystemStats::hasSSE42() noexcept { return getCPUInformation().hasSSE42; }
121bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; }
122bool SystemStats::hasAVX2() noexcept { return getCPUInformation().hasAVX2; }
123bool SystemStats::hasAVX512F() noexcept { return getCPUInformation().hasAVX512F; }
124bool SystemStats::hasAVX512BW() noexcept { return getCPUInformation().hasAVX512BW; }
125bool SystemStats::hasAVX512CD() noexcept { return getCPUInformation().hasAVX512CD; }
126bool SystemStats::hasAVX512DQ() noexcept { return getCPUInformation().hasAVX512DQ; }
127bool SystemStats::hasAVX512ER() noexcept { return getCPUInformation().hasAVX512ER; }
128bool SystemStats::hasAVX512IFMA() noexcept { return getCPUInformation().hasAVX512IFMA; }
129bool SystemStats::hasAVX512PF() noexcept { return getCPUInformation().hasAVX512PF; }
130bool SystemStats::hasAVX512VBMI() noexcept { return getCPUInformation().hasAVX512VBMI; }
131bool SystemStats::hasAVX512VL() noexcept { return getCPUInformation().hasAVX512VL; }
132bool SystemStats::hasAVX512VPOPCNTDQ() noexcept { return getCPUInformation().hasAVX512VPOPCNTDQ; }
133bool SystemStats::hasNeon() noexcept { return getCPUInformation().hasNeon; }
134
135
136//==============================================================================
138{
139 String result;
140
141 #if JUCE_ANDROID || JUCE_MINGW || !defined(__GLIBC__)
142 jassertfalse; // sorry, not implemented yet!
143
144 #elif JUCE_WINDOWS
145 HANDLE process = GetCurrentProcess();
146 SymInitialize (process, nullptr, TRUE);
147
148 void* stack[128];
149 int frames = (int) CaptureStackBackTrace (0, numElementsInArray (stack), stack, nullptr);
150
152 symbol.calloc (sizeof (SYMBOL_INFO) + 256, 1);
153 symbol->MaxNameLen = 255;
154 symbol->SizeOfStruct = sizeof (SYMBOL_INFO);
155
156 for (int i = 0; i < frames; ++i)
157 {
159
160 if (SymFromAddr (process, (DWORD64) stack[i], &displacement, symbol))
161 {
162 result << i << ": ";
163
165 zerostruct (moduleInfo);
166 moduleInfo.SizeOfStruct = sizeof (moduleInfo);
167
168 if (::SymGetModuleInfo64 (process, symbol->ModBase, &moduleInfo))
169 result << moduleInfo.ModuleName << ": ";
170
171 result << symbol->Name << " + 0x" << String::toHexString ((int64) displacement) << newLine;
172 }
173 }
174
175 #else
176 void* stack[128];
177 int frames = backtrace (stack, numElementsInArray (stack));
179
180 for (int i = 0; i < frames; ++i)
181 result << frameStrings[i] << newLine;
182
183 ::free (frameStrings);
184 #endif
185
186 return result;
187}
188
189//==============================================================================
190static SystemStats::CrashHandlerFunction globalCrashHandler = nullptr;
191
192#if JUCE_WINDOWS
193static LONG WINAPI handleCrash (LPEXCEPTION_POINTERS ep)
194{
195 globalCrashHandler (ep);
197}
198#else
199static void handleCrash (int signum)
200{
201 globalCrashHandler ((void*) (pointer_sized_int) signum);
202 ::kill (getpid(), SIGKILL);
203}
204
205int juce_siginterrupt (int sig, int flag);
206#endif
207
209{
210 jassert (handler != nullptr); // This must be a valid function.
211 globalCrashHandler = handler;
212
213 #if JUCE_WINDOWS
214 SetUnhandledExceptionFilter (handleCrash);
215 #else
216 const int signals[] = { SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT, SIGSYS };
217
218 for (int i = 0; i < numElementsInArray (signals); ++i)
219 {
220 ::signal (signals[i], handleCrash);
221 juce_siginterrupt (signals[i], 1);
222 }
223 #endif
224}
225
227{
228 #if JUCE_MAC || JUCE_IOS
229 static bool firstQuery = true;
230 static bool isRunningInAppSandbox = false;
231
232 if (firstQuery)
233 {
234 firstQuery = false;
235
237
238 #if JUCE_MAC
239 bundle = bundle.getParentDirectory().getParentDirectory();
240 #endif
241
242 if (bundle.isDirectory())
243 isRunningInAppSandbox = (bundle.getFileExtension() == ".appex");
244 }
245
247 #else
248 return false;
249 #endif
250}
251
252} // namespace juce
bool isEmpty() const noexcept
Definition juce_Array.h:222
Array()=default
void add(const ElementType &newElement)
Definition juce_Array.h:418
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
@ invokedExecutableFile
Definition juce_File.h:912
uint64 getFileIdentifier() const
static Array< MACAddress > getAllAddresses()
static String toHexString(IntegerType number)
static bool hasAVX512CD() noexcept
static String getStackBacktrace()
static bool hasMMX() noexcept
static void setApplicationCrashHandler(CrashHandlerFunction)
void(*)(void *) CrashHandlerFunction
static int getNumPhysicalCpus() noexcept
static bool hasAVX512ER() noexcept
static bool has3DNow() noexcept
static bool hasAVX2() noexcept
static bool hasAVX512VPOPCNTDQ() noexcept
static bool hasSSE() noexcept
static bool hasAVX512DQ() noexcept
static bool isRunningInAppExtensionSandbox() noexcept
static bool hasNeon() noexcept
static bool hasAVX512F() noexcept
static bool hasSSE3() noexcept
static bool hasSSE2() noexcept
static bool hasAVX() noexcept
static bool hasAVX512VBMI() noexcept
static bool hasSSSE3() noexcept
static bool hasAVX512VL() noexcept
static bool hasAVX512PF() noexcept
static bool hasSSE41() noexcept
static StringArray getDeviceIdentifiers()
static bool hasFMA4() noexcept
static String getJUCEVersion()
static bool hasSSE42() noexcept
static bool hasFMA3() noexcept
static bool hasAVX512IFMA() noexcept
static bool hasAVX512BW() noexcept
static int getNumCpus() noexcept