return stripped;
}
+#ifdef _WIN32
+static double GetLoadAverage_win32()
+{
+ // TODO(nicolas.despres@gmail.com): Find a way to implement it on Windows.
+ return -0.0f;
+}
+#else
+static double GetLoadAverage_unix()
+{
+ double loadavg[3] = { 0.0f, 0.0f, 0.0f };
+ if (getloadavg(loadavg, 3) < 0)
+ {
+ // Maybe we should return an error here or the availability of
+ // getloadavg(3) should be checked when ninja is configured.
+ return -0.0f;
+ }
+ return loadavg[0];
+}
+#endif // _WIN32
+
+double GetLoadAverage()
+{
+#ifdef _WIN32
+ return GetLoadAverage_win32();
+#else
+ return GetLoadAverage_unix();
+#endif // _WIN32
+}
++
+ #ifdef _MSC_VER\r
+ typedef BOOL (WINAPI *MiniDumpWriteDumpFunc) (\r
+ IN HANDLE,\r
+ IN DWORD,\r
+ IN HANDLE,\r
+ IN MINIDUMP_TYPE,\r
+ IN CONST PMINIDUMP_EXCEPTION_INFORMATION, OPTIONAL\r
+ IN CONST PMINIDUMP_USER_STREAM_INFORMATION, OPTIONAL\r
+ IN CONST PMINIDUMP_CALLBACK_INFORMATION OPTIONAL\r
+ );\r
+ \r
+ /// this function creates a windows minidump in temp folder.\r
+ void Create_Win32_MiniDump( _EXCEPTION_POINTERS* pep ) {\r
+ char tempPathBuff[MAX_PATH];\r
+ GetTempPath(sizeof(tempPathBuff), tempPathBuff);\r
+ char tempFileName[MAX_PATH];\r
+ sprintf(tempFileName, "%s\\ninja_crash_dump_%d.dmp", tempPathBuff, GetCurrentProcessId());\r
+ \r
+ //delete any previous minidump of the same name\r
+ DeleteFile(tempFileName);\r
+ \r
+ // load DbgHelp.dll dynamically, as library is not present on all windows versions\r
+ HMODULE hModDbgHelp = LoadLibrary("dbghelp.dll"); \r
+ if (hModDbgHelp == NULL) {\r
+ fprintf(stderr, "ninja: failed to create minidump, failed to load dbghelp.dll, error %s \n",
+ GetLastErrorString().c_str());\r
+ return;\r
+ }\r
+ \r
+ MiniDumpWriteDumpFunc pfnMiniDumpWriteDump = (MiniDumpWriteDumpFunc)GetProcAddress(hModDbgHelp, "MiniDumpWriteDump");\r
+ if (pfnMiniDumpWriteDump == NULL) {\r
+ fprintf(stderr, "ninja: failed to create minidump, failed on GetProcAddress('MiniDumpWriteDump'), error %s \n",
+ GetLastErrorString().c_str());\r
+ return;\r
+ }\r
+ \r
+ // Open the file \r
+ HANDLE hFile = CreateFileA( tempFileName, GENERIC_READ | GENERIC_WRITE, \r
+ 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); \r
+ if (hFile == NULL) {\r
+ fprintf(stderr, "ninja: failed to create minidump, failed on CreateFileA(%s), error %s \n",
+ tempFileName, GetLastErrorString().c_str());\r
+ return;\r
+ }\r
+ \r
+ // Create the mini dump \r
+ MINIDUMP_EXCEPTION_INFORMATION mdei; \r
+ mdei.ThreadId = GetCurrentThreadId(); \r
+ mdei.ExceptionPointers = pep;\r
+ mdei.ClientPointers = FALSE; \r
+ MINIDUMP_TYPE mdt = (MINIDUMP_TYPE) (MiniDumpWithDataSegs | MiniDumpWithHandleData);\r
+ \r
+ BOOL rv = pfnMiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), \r
+ hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0 ); \r
+ \r
+ if ( !rv ) \r
+ fprintf(stderr, "ninja: MiniDumpWriteDump failed. Error: %s \n", GetLastErrorString().c_str() );\r
+ else \r
+ fprintf(stderr, "ninja: Minidump created: %s\n", tempFileName );\r
+ \r
+ // Close the file \r
+ CloseHandle( hFile ); \r
+ }\r
+ \r
+ /// On Windows, we want to prevent error dialogs in case of exceptions.\r
+ /// This function handles the exception, and writes a minidump.\r
+ int exception_filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {\r
+ fprintf(stderr, "ninja.exe fatal error: 0x%X \n", code); //e.g. EXCEPTION_ACCESS_VIOLATION
+ fflush(stderr);
+ Create_Win32_MiniDump(ep);
+ return EXCEPTION_EXECUTE_HANDLER; \r
+ } \r
+ #else \r
+ //on Linux or MinGW, core dumps are created automatically, no code needed\r
+ #endif\r
+ \r
++