]> granicus.if.org Git - graphviz/commitdiff
cgraph: also flush C++ iostreams in exit wrapper
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 17 Apr 2022 21:31:35 +0000 (14:31 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 19 Apr 2022 14:28:46 +0000 (07:28 -0700)
This exit wrapper works around an issue where processes running under MinGW can
exit with unbuffered data remaining in their stdout and stderr internal buffers
without being flushed. The C stdio and C++ iostreams implementations can have
separate buffers. Thus when using this wrapper in C++ code in combination with
C++ iostreams (e.g. cmd/mingle/minglemain.cpp) we need to additionally flush the
C++ buffers as well.

Gitlab: #2178

lib/cgraph/exit.h

index 650951b28ac91c4558aefa0f6c34e4af7564b422..e9fd3b9d7da597c97fb8dd15dc0d2b8106455af8 100644 (file)
@@ -4,6 +4,8 @@
 #include <stdlib.h>
 
 #ifdef __cplusplus
+#include <iostream>
+
 extern "C" {
 #endif
 
@@ -21,6 +23,10 @@ static inline NORETURN void graphviz_exit(int status) {
   // workaround for https://gitlab.com/graphviz/graphviz/-/issues/2178
   fflush(stdout);
   fflush(stderr);
+#ifdef __cplusplus
+  std::cout.flush();
+  std::cerr.flush();
+#endif
 #endif
   exit(status);
 }