]> git.cworth.org Git - apitrace/blobdiff - common/os_win32.cpp
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / common / os_win32.cpp
index 7e1a544a163597997130251f0f269ebfb63b2342..e9306cdc6dfa0168b3bca328d5511b66bb551932 100644 (file)
 namespace os {
 
 
-/* 
- * Trick from http://locklessinc.com/articles/pthreads_on_windows/
- */
-static CRITICAL_SECTION
-criticalSection = {
-    (PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0
-};
-
-
-void
-acquireMutex(void)
-{
-    EnterCriticalSection(&criticalSection);
-}
-
-
-void
-releaseMutex(void)
-{
-    LeaveCriticalSection(&criticalSection);
-}
-
-
 String
 getProcessName(void)
 {
@@ -99,6 +76,18 @@ String::exists(void) const
     return attrs != INVALID_FILE_ATTRIBUTES;
 }
 
+bool
+copyFile(const String &srcFileName, const String &dstFileName, bool override)
+{
+    return CopyFileA(srcFileName, dstFileName, !override);
+}
+
+bool
+removeFile(const String &srcFilename)
+{
+    return DeleteFileA(srcFilename);
+}
+
 /**
  * Determine whether an argument should be quoted.
  */
@@ -136,7 +125,6 @@ quoteArg(std::string &s, const char *arg)
     s.push_back('"');
     while (true) {
         c = *arg++;
-        switch (c)
         if (c == '\0') {
             break;
         } else if (c == '"') {
@@ -201,7 +189,7 @@ int execute(char * const * args)
 
     WaitForSingleObject(processInformation.hProcess, INFINITE);
 
-    DWORD exitCode = ~0;
+    DWORD exitCode = ~0UL;
     GetExitCodeProcess(processInformation.hProcess, &exitCode);
 
     CloseHandle(processInformation.hProcess);
@@ -236,16 +224,7 @@ log(const char *format, ...)
 #endif
 }
 
-long long
-getTime(void)
-{
-    static LARGE_INTEGER frequency;
-    LARGE_INTEGER counter;
-    if (!frequency.QuadPart)
-        QueryPerformanceFrequency(&frequency);
-    QueryPerformanceCounter(&counter);
-    return counter.QuadPart*1000000LL/frequency.QuadPart;
-}
+long long timeFrequency = 0LL;
 
 void
 abort(void)
@@ -258,6 +237,10 @@ abort(void)
 }
 
 
+#ifndef DBG_PRINTEXCEPTION_C
+#define DBG_PRINTEXCEPTION_C 0x40010006
+#endif
+
 static PVOID prevExceptionFilter = NULL;
 static void (*gCallback)(void) = NULL;
 
@@ -283,11 +266,31 @@ unhandledExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
         return EXCEPTION_CONTINUE_SEARCH;
     }
 
+    /*
+     * Ignore thread naming exception.
+     *
+     * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
+     */
+    if (pExceptionRecord->ExceptionCode == 0x406d1388) {
+        return EXCEPTION_CONTINUE_SEARCH;
+    }
+
+    /*
+     * Ignore .NET exception.
+     *
+     * http://ig2600.blogspot.co.uk/2011/01/why-do-i-keep-getting-exception-code.html
+     */
+    if (pExceptionRecord->ExceptionCode == 0xe0434352) {
+        return EXCEPTION_CONTINUE_SEARCH;
+    }
+
     // Clear direction flag
 #ifdef _MSC_VER
+#ifndef _WIN64
     __asm {
         cld
     };
+#endif
 #else
     asm("cld");
 #endif