]> git.llucax.com Git - software/dgc/cdgc.git/commitdiff
Avoid output duplication because of FILE* buffers
authorLeandro Lucarella <llucax@gmail.com>
Mon, 6 Sep 2010 02:02:45 +0000 (23:02 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 6 Sep 2010 02:11:35 +0000 (23:11 -0300)
FILE* buffers are duplicated when fork()ing, and at program exit(), the C
library flushes the FILE* buffers, resulting in duplicated output.

To avoid this we flush all FILE* buffers before fork()ing.

rt/gc/cdgc/gc.d

index 2d75813021e6eb0ce5d6d779cb4609000d96eb41..96c6a86360d24277f0456ea9038f17580f90864d 100644 (file)
@@ -50,6 +50,7 @@ import opts = rt.gc.cdgc.opts;
 
 import cstdlib = tango.stdc.stdlib;
 import cstring = tango.stdc.string;
 
 import cstdlib = tango.stdc.stdlib;
 import cstring = tango.stdc.string;
+import cstdio = tango.stdc.stdio;
 
 /*
  * This is a small optimization that proved it's usefulness. For small chunks
 
 /*
  * This is a small optimization that proved it's usefulness. For small chunks
@@ -786,6 +787,7 @@ size_t fullcollect(void *stackTop)
     gc.stats.world_stopped();
 
     if (opts.options.fork) {
     gc.stats.world_stopped();
 
     if (opts.options.fork) {
+        cstdio.fflush(null); // avoid duplicated FILE* output
         os.pid_t child_pid = os.fork();
         assert (child_pid != -1); // don't accept errors in non-release mode
         switch (child_pid) {
         os.pid_t child_pid = os.fork();
         assert (child_pid != -1); // don't accept errors in non-release mode
         switch (child_pid) {