execution: bugfix - resolved promises should propagate synchronization
[cdsspec-compiler.git] / stacktrace.h
index 01d31d2f33c2e72fcc54ce8d120baed359fead08..a3b035096e796f13809eb4eedcfeada7bc84c9ba 100644 (file)
@@ -9,10 +9,13 @@
 #include <execinfo.h>
 #include <cxxabi.h>
 
-/** Print a demangled stack backtrace of the caller function to FILE* out. */
-static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63)
+/**
+ * @brief Print a demangled stack backtrace of the caller function to file
+ * descriptor fd.
+ */
+static inline void print_stacktrace(int fd = STDERR_FILENO, unsigned int max_frames = 63)
 {
-       fprintf(out, "stack trace:\n");
+       dprintf(fd, "stack trace:\n");
 
        // storage array for stack trace address data
        void* addrlist[max_frames+1];
@@ -21,7 +24,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
        int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
 
        if (addrlen == 0) {
-               fprintf(out, "  <empty, possibly corrupt>\n");
+               dprintf(fd, "  <empty, possibly corrupt>\n");
                return;
        }
 
@@ -65,17 +68,17 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
                                        funcname, &funcnamesize, &status);
                        if (status == 0) {
                                funcname = ret; // use possibly realloc()-ed string
-                               fprintf(out, "  %s : %s+%s\n",
+                               dprintf(fd, "  %s : %s+%s\n",
                                                symbollist[i], funcname, begin_offset);
                        } else {
                                // demangling failed. Output function name as a C function with
                                // no arguments.
-                               fprintf(out, "  %s : %s()+%s\n",
+                               dprintf(fd, "  %s : %s()+%s\n",
                                                symbollist[i], begin_name, begin_offset);
                        }
                } else {
                        // couldn't parse the line? print the whole line.
-                       fprintf(out, "  %s\n", symbollist[i]);
+                       dprintf(fd, "  %s\n", symbollist[i]);
                }
        }
 
@@ -83,4 +86,9 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
        free(symbollist);
 }
 
+static inline void print_stacktrace(FILE *out, unsigned int max_frames = 63)
+{
+       print_stacktrace(fileno(out), max_frames);
+}
+
 #endif // __STACKTRACE_H__