OpenShot Library | OpenShotAudio  0.2.1
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 
23 namespace 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
50  struct JuceVersionPrinter
51  {
52  JuceVersionPrinter()
53  {
55  }
56  };
57 
58  static JuceVersionPrinter juceVersionPrinter;
59 #endif
60 
62 {
63  StringArray ids;
64 
65  #if JUCE_WINDOWS
67  #else
68  File f ("~");
69  #endif
70  if (auto num = f.getFileIdentifier())
71  {
72  ids.add (String::toHexString ((int64) num));
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 //==============================================================================
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 
103 static const CPUInformation& getCPUInformation() noexcept
104 {
105  static CPUInformation info;
106  return info;
107 }
108 
109 int SystemStats::getNumCpus() noexcept { return getCPUInformation().numLogicalCPUs; }
110 int SystemStats::getNumPhysicalCpus() noexcept { return getCPUInformation().numPhysicalCPUs; }
111 bool SystemStats::hasMMX() noexcept { return getCPUInformation().hasMMX; }
112 bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; }
113 bool SystemStats::hasFMA3() noexcept { return getCPUInformation().hasFMA3; }
114 bool SystemStats::hasFMA4() noexcept { return getCPUInformation().hasFMA4; }
115 bool SystemStats::hasSSE() noexcept { return getCPUInformation().hasSSE; }
116 bool SystemStats::hasSSE2() noexcept { return getCPUInformation().hasSSE2; }
117 bool SystemStats::hasSSE3() noexcept { return getCPUInformation().hasSSE3; }
118 bool SystemStats::hasSSSE3() noexcept { return getCPUInformation().hasSSSE3; }
119 bool SystemStats::hasSSE41() noexcept { return getCPUInformation().hasSSE41; }
120 bool SystemStats::hasSSE42() noexcept { return getCPUInformation().hasSSE42; }
121 bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; }
122 bool SystemStats::hasAVX2() noexcept { return getCPUInformation().hasAVX2; }
123 bool SystemStats::hasAVX512F() noexcept { return getCPUInformation().hasAVX512F; }
124 bool SystemStats::hasAVX512BW() noexcept { return getCPUInformation().hasAVX512BW; }
125 bool SystemStats::hasAVX512CD() noexcept { return getCPUInformation().hasAVX512CD; }
126 bool SystemStats::hasAVX512DQ() noexcept { return getCPUInformation().hasAVX512DQ; }
127 bool SystemStats::hasAVX512ER() noexcept { return getCPUInformation().hasAVX512ER; }
128 bool SystemStats::hasAVX512IFMA() noexcept { return getCPUInformation().hasAVX512IFMA; }
129 bool SystemStats::hasAVX512PF() noexcept { return getCPUInformation().hasAVX512PF; }
130 bool SystemStats::hasAVX512VBMI() noexcept { return getCPUInformation().hasAVX512VBMI; }
131 bool SystemStats::hasAVX512VL() noexcept { return getCPUInformation().hasAVX512VL; }
132 bool SystemStats::hasAVX512VPOPCNTDQ() noexcept { return getCPUInformation().hasAVX512VPOPCNTDQ; }
133 bool SystemStats::hasNeon() noexcept { return getCPUInformation().hasNeon; }
134 
135 
136 //==============================================================================
138 {
139  String result;
140 
141  #if JUCE_ANDROID || JUCE_MINGW
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 
151  HeapBlock<SYMBOL_INFO> symbol;
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  {
158  DWORD64 displacement = 0;
159 
160  if (SymFromAddr (process, (DWORD64) stack[i], &displacement, symbol))
161  {
162  result << i << ": ";
163 
164  IMAGEHLP_MODULE64 moduleInfo;
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));
178  char** frameStrings = backtrace_symbols (stack, frames);
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 //==============================================================================
190 static SystemStats::CrashHandlerFunction globalCrashHandler = nullptr;
191 
192 #if JUCE_WINDOWS
193 static LONG WINAPI handleCrash (LPEXCEPTION_POINTERS ep)
194 {
195  globalCrashHandler (ep);
196  return EXCEPTION_EXECUTE_HANDLER;
197 }
198 #else
199 static void handleCrash (int signum)
200 {
201  globalCrashHandler ((void*) (pointer_sized_int) signum);
202  ::kill (getpid(), SIGKILL);
203 }
204 
205 int 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 
246  return isRunningInAppSandbox;
247  #else
248  return false;
249  #endif
250 }
251 
252 } // namespace juce
bool isEmpty() const noexcept
Returns true if the array is empty, false otherwise.
static bool has3DNow() noexcept
Returns true if AMD 3DNOW instructions are available.
static bool hasAVX512PF() noexcept
Returns true if Intel AVX-512 Prefetch instructions are available.
static bool hasAVX512VPOPCNTDQ() noexcept
Returns true if Intel AVX-512 Vector Population Count Double and Quad-word instructions are available...
static Array< MACAddress > getAllAddresses()
Returns a list of the MAC addresses of all the available network cards.
File getParentDirectory() const
Returns the directory that contains this file or directory.
Definition: juce_File.cpp:360
Very simple container class to hold a pointer to some data on the heap.
static bool hasAVX512F() noexcept
Returns true if Intel AVX-512 Foundation instructions are available.
static bool hasAVX() noexcept
Returns true if Intel AVX instructions are available.
A special array for holding a list of strings.
The JUCE String class!
Definition: juce_String.h:42
static bool hasSSE2() noexcept
Returns true if Intel SSE2 instructions are available.
void calloc(SizeType newNumElements, const size_t elementSize=sizeof(ElementType))
Allocates a specified amount of memory and clears it.
static bool hasFMA4() noexcept
Returns true if AMD FMA4 instructions are available.
static bool hasSSSE3() noexcept
Returns true if Intel SSSE3 instructions are available.
static String getJUCEVersion()
Returns the current version of JUCE, See also the JUCE_VERSION, JUCE_MAJOR_VERSION and JUCE_MINOR_VER...
void(*)(void *) CrashHandlerFunction
A function type for use in setApplicationCrashHandler().
static void setApplicationCrashHandler(CrashHandlerFunction)
Sets up a global callback function that will be called if the application executes some kind of illeg...
static bool hasNeon() noexcept
Returns true if ARM NEON instructions are available.
static String toHexString(IntegerType number)
Returns a string representing this numeric value in hexadecimal.
Definition: juce_String.h:1057
#define JUCE_MAJOR_VERSION
Current JUCE version number.
static bool hasSSE41() noexcept
Returns true if Intel SSE4.1 instructions are available.
Represents a local file or directory.
Definition: juce_File.h:44
String getFileExtension() const
Returns the file&#39;s extension.
Definition: juce_File.cpp:669
static String getStackBacktrace()
Returns a backtrace of the current call-stack.
static bool hasSSE42() noexcept
Returns true if Intel SSE4.2 instructions are available.
static bool hasSSE3() noexcept
Returns true if Intel SSE3 instructions are available.
static bool hasSSE() noexcept
Returns true if Intel SSE instructions are available.
static bool hasAVX512BW() noexcept
Returns true if Intel AVX-512 Byte and Word instructions are available.
On a Windows machine, returns the location of the Windows/System32 folder.
Definition: juce_File.h:923
static bool hasAVX512VL() noexcept
Returns true if Intel AVX-512 Vector Length instructions are available.
static bool isRunningInAppExtensionSandbox() noexcept
Returns true if this code is running inside an app extension sandbox.
static bool hasAVX512DQ() noexcept
Returns true if Intel AVX-512 Doubleword and Quadword instructions are available. ...
bool isDirectory() const
Checks whether the file is a directory that exists.
static int getNumPhysicalCpus() noexcept
Returns the number of physical CPU cores.
static bool hasAVX512CD() noexcept
Returns true if Intel AVX-512 Conflict Detection instructions are available.
static bool hasAVX512ER() noexcept
Returns true if Intel AVX-512 Exponential and Reciprocal instructions are available.
static bool hasAVX512IFMA() noexcept
Returns true if Intel AVX-512 Integer Fused Multiply-Add instructions are available.
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
Finds the location of a special type of file or directory, such as a home folder or documents folder...
static bool hasFMA3() noexcept
Returns true if AMD FMA3 instructions are available.
static bool hasAVX2() noexcept
Returns true if Intel AVX2 instructions are available.
static int getNumCpus() noexcept
Returns the number of logical CPU cores.
static bool hasMMX() noexcept
Returns true if Intel MMX instructions are available.
uint64 getFileIdentifier() const
Returns a unique identifier for the file, if one is available.
void add(String stringToAdd)
Appends a string at the end of the array.
Returns the file that was invoked to launch this executable.
Definition: juce_File.h:916
static bool hasAVX512VBMI() noexcept
Returns true if Intel AVX-512 Vector Bit Manipulation instructions are available. ...
static StringArray getDeviceIdentifiers()
This method calculates some IDs to uniquely identify the device.