123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- ==============================================================================
- This file is part of the juce_core module of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
- Permission to use, copy, modify, and/or distribute this software for any purpose with
- or without fee is hereby granted, provided that the above copyright notice and this
- permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
- NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- ------------------------------------------------------------------------------
- NOTE! This permissive ISC license applies ONLY to files within the juce_core module!
- All other JUCE modules are covered by a dual GPL/commercial license, so if you are
- using any other modules, be sure to check that you also comply with their license.
- For more details, visit www.juce.com
- ==============================================================================
- */
- String SystemStats::getJUCEVersion()
- {
- // Some basic tests, to keep an eye on things and make sure these types work ok
- // on all platforms. Let me know if any of these assertions fail on your system!
- static_jassert (sizeof (pointer_sized_int) == sizeof (void*));
- static_jassert (sizeof (int8) == 1);
- static_jassert (sizeof (uint8) == 1);
- static_jassert (sizeof (int16) == 2);
- static_jassert (sizeof (uint16) == 2);
- static_jassert (sizeof (int32) == 4);
- static_jassert (sizeof (uint32) == 4);
- static_jassert (sizeof (int64) == 8);
- static_jassert (sizeof (uint64) == 8);
- return "JUCE v" JUCE_STRINGIFY(JUCE_MAJOR_VERSION)
- "." JUCE_STRINGIFY(JUCE_MINOR_VERSION)
- "." JUCE_STRINGIFY(JUCE_BUILDNUMBER);
- }
- #if JUCE_ANDROID && ! defined (JUCE_DISABLE_JUCE_VERSION_PRINTING)
- #define JUCE_DISABLE_JUCE_VERSION_PRINTING 1
- #endif
- #if JUCE_DEBUG && ! JUCE_DISABLE_JUCE_VERSION_PRINTING
- struct JuceVersionPrinter
- {
- JuceVersionPrinter()
- {
- DBG (SystemStats::getJUCEVersion());
- }
- };
- static JuceVersionPrinter juceVersionPrinter;
- #endif
- //==============================================================================
- struct CPUInformation
- {
- CPUInformation() noexcept
- : numCpus (0), hasMMX (false), hasSSE (false),
- hasSSE2 (false), hasSSE3 (false), has3DNow (false)
- {
- initialise();
- }
- void initialise() noexcept;
- int numCpus;
- bool hasMMX, hasSSE, hasSSE2, hasSSE3, has3DNow;
- };
- static const CPUInformation& getCPUInformation() noexcept
- {
- static CPUInformation info;
- return info;
- }
- int SystemStats::getNumCpus() noexcept { return getCPUInformation().numCpus; }
- bool SystemStats::hasMMX() noexcept { return getCPUInformation().hasMMX; }
- bool SystemStats::hasSSE() noexcept { return getCPUInformation().hasSSE; }
- bool SystemStats::hasSSE2() noexcept { return getCPUInformation().hasSSE2; }
- bool SystemStats::hasSSE3() noexcept { return getCPUInformation().hasSSE3; }
- bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; }
- //==============================================================================
- String SystemStats::getStackBacktrace()
- {
- String result;
- #if JUCE_ANDROID || JUCE_MINGW
- jassertfalse; // sorry, not implemented yet!
- #elif JUCE_WINDOWS
- HANDLE process = GetCurrentProcess();
- SymInitialize (process, nullptr, TRUE);
- void* stack[128];
- int frames = (int) CaptureStackBackTrace (0, numElementsInArray (stack), stack, nullptr);
- HeapBlock<SYMBOL_INFO> symbol;
- symbol.calloc (sizeof (SYMBOL_INFO) + 256, 1);
- symbol->MaxNameLen = 255;
- symbol->SizeOfStruct = sizeof (SYMBOL_INFO);
- for (int i = 0; i < frames; ++i)
- {
- DWORD64 displacement = 0;
- if (SymFromAddr (process, (DWORD64) stack[i], &displacement, symbol))
- {
- result << i << ": ";
- IMAGEHLP_MODULE64 moduleInfo;
- zerostruct (moduleInfo);
- moduleInfo.SizeOfStruct = sizeof (moduleInfo);
- if (::SymGetModuleInfo64 (process, symbol->ModBase, &moduleInfo))
- result << moduleInfo.ModuleName << ": ";
- result << symbol->Name << " + 0x" << String::toHexString ((int64) displacement) << newLine;
- }
- }
- #else
- void* stack[128];
- int frames = backtrace (stack, numElementsInArray (stack));
- char** frameStrings = backtrace_symbols (stack, frames);
- for (int i = 0; i < frames; ++i)
- result << frameStrings[i] << newLine;
- ::free (frameStrings);
- #endif
- return result;
- }
- //==============================================================================
- static SystemStats::CrashHandlerFunction globalCrashHandler = nullptr;
- #if JUCE_WINDOWS
- static LONG WINAPI handleCrash (LPEXCEPTION_POINTERS)
- {
- globalCrashHandler();
- return EXCEPTION_EXECUTE_HANDLER;
- }
- #else
- static void handleCrash (int)
- {
- globalCrashHandler();
- kill (getpid(), SIGKILL);
- }
- int juce_siginterrupt (int sig, int flag);
- #endif
- void SystemStats::setApplicationCrashHandler (CrashHandlerFunction handler)
- {
- jassert (handler != nullptr); // This must be a valid function.
- globalCrashHandler = handler;
- #if JUCE_WINDOWS
- SetUnhandledExceptionFilter (handleCrash);
- #else
- const int signals[] = { SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT, SIGSYS };
- for (int i = 0; i < numElementsInArray (signals); ++i)
- {
- ::signal (signals[i], handleCrash);
- juce_siginterrupt (signals[i], 1);
- }
- #endif
- }
|