]> git.cworth.org Git - apitrace/commitdiff
Use the exception handler from localWriter to only flush on a signal.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 24 Aug 2011 18:33:06 +0000 (19:33 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 24 Aug 2011 18:33:06 +0000 (19:33 +0100)
trace_local_writer.cpp
trace_writer.hpp

index 9dc746e9e6c9e63811b8d8fe0969f22e5f0762ff..ae6a6b66699bf6b215643609f188ec00229f6bfd 100644 (file)
 namespace Trace {
 
 
-LocalWriter::LocalWriter() {
+static void exceptionCallback(void)
+{
+    OS::DebugMessage("apitrace: flushing trace due to an exception\n");
+    localWriter.flush();
+}
+
+
+LocalWriter::LocalWriter() :
+    acquired(0)
+{}
+
+LocalWriter::~LocalWriter()
+{
+    OS::ResetExceptionCallback();
 }
 
 void
@@ -83,10 +96,18 @@ LocalWriter::open(void) {
     OS::DebugMessage("apitrace: tracing to %s\n", szFileName);
 
     Writer::open(szFileName);
+
+    OS::SetExceptionCallback(exceptionCallback);
+
+#if 0
+    // For debugging the exception handler
+    *((int *)0) = 0;
+#endif
 }
 
 unsigned LocalWriter::beginEnter(const FunctionSig *sig) {
     OS::AcquireMutex();
+    ++acquired;
 
     if (!g_gzFile) {
         open();
@@ -97,21 +118,37 @@ unsigned LocalWriter::beginEnter(const FunctionSig *sig) {
 
 void LocalWriter::endEnter(void) {
     Writer::endEnter();
-    gzflush(g_gzFile, Z_SYNC_FLUSH);
+    --acquired;
     OS::ReleaseMutex();
 }
 
 void LocalWriter::beginLeave(unsigned call) {
     OS::AcquireMutex();
+    ++acquired;
     Writer::beginLeave(call);
 }
 
 void LocalWriter::endLeave(void) {
     Writer::endLeave();
-    gzflush(g_gzFile, Z_SYNC_FLUSH);
+    --acquired;
     OS::ReleaseMutex();
 }
 
+void LocalWriter::flush(void) {
+    /*
+     * Do nothing if the mutex is already acquired (e.g., if a segfault happen
+     * while writing the file) to prevent dead-lock.
+     */
+
+    if (!acquired) {
+        OS::AcquireMutex();
+            if (g_gzFile) {
+                gzflush(g_gzFile, Z_SYNC_FLUSH);
+            }
+        OS::ReleaseMutex();
+    }
+}
+
 
 LocalWriter localWriter;
 
index d9597141d29db251ee90412a61bc721fa0cd1b69..94ca4fd811b40c43e9f71922c3081e4985718b76 100644 (file)
@@ -115,11 +115,14 @@ namespace Trace {
      */
     class LocalWriter : public Writer {
     protected:
+        int acquired;
+
     public:
         /**
          * Should never called directly -- use localWriter singleton below instead.
          */
         LocalWriter();
+        ~LocalWriter();
 
         void open(void);
 
@@ -128,6 +131,8 @@ namespace Trace {
 
         void beginLeave(unsigned call);
         void endLeave(void);
+
+        void flush(void);
     };
 
     /**