OpenShot Audio Library | OpenShotAudio  0.3.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
66  File f (File::getSpecialLocation (File::windowsSystemDirectory));
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 //==============================================================================
85 struct 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 
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
static bool has3DNow() noexcept
static bool hasAVX512PF() noexcept
static bool hasAVX512VPOPCNTDQ() noexcept
static Array< MACAddress > getAllAddresses()
File getParentDirectory() const
Definition: juce_File.cpp:360
static bool hasAVX512F() noexcept
static bool hasAVX() noexcept
static bool hasSSE2() noexcept
void calloc(SizeType newNumElements, const size_t elementSize=sizeof(ElementType))
static bool hasFMA4() noexcept
static bool hasSSSE3() noexcept
static String getJUCEVersion()
void(*)(void *) CrashHandlerFunction
static void setApplicationCrashHandler(CrashHandlerFunction)
static bool hasNeon() noexcept
static String toHexString(IntegerType number)
Definition: juce_String.h:1053
static bool hasSSE41() noexcept
String getFileExtension() const
Definition: juce_File.cpp:669
static String getStackBacktrace()
static bool hasSSE42() noexcept
static bool hasSSE3() noexcept
static bool hasSSE() noexcept
static bool hasAVX512BW() noexcept
static bool hasAVX512VL() noexcept
static bool isRunningInAppExtensionSandbox() noexcept
static bool hasAVX512DQ() noexcept
bool isDirectory() const
static int getNumPhysicalCpus() noexcept
static bool hasAVX512CD() noexcept
static bool hasAVX512ER() noexcept
static bool hasAVX512IFMA() noexcept
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
static bool hasFMA3() noexcept
static bool hasAVX2() noexcept
static int getNumCpus() noexcept
static bool hasMMX() noexcept
uint64 getFileIdentifier() const
void add(String stringToAdd)
static bool hasAVX512VBMI() noexcept
static StringArray getDeviceIdentifiers()