# New Ticket Created by  Bram Geron 
# Please include the string:  [perl #44351]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44351 >


When GC_VERBOSE=1 and tracing is on, Parrot spits out messages about
PObjs getting destroyed. These messages are getting spit out with
PIO_eprintf, which accesses the ParrotIO object for stderr. The problem
is that at Parrot_exit, all PObjs are destroyed (including ParrotIO
objects), and trying to spit out such messages will fail with a SIGSEGV.

This patch turns off such tracing with a notice just before
force-destroying all PObjs (no matter the setting of GC_VERBOSE).
Without tracing enabled, it does nothing.

 include/parrot/dod.h |    3 ++-
 src/inter_create.c   |    8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

-- 
Bram Geron | GPG 0xE7B9E65E

diff --git a/include/parrot/dod.h b/include/parrot/dod.h
index 79c1831..15df0e0 100644
--- a/include/parrot/dod.h
+++ b/include/parrot/dod.h
@@ -44,7 +44,8 @@
 #define DOD_trace_stack_FLAG    (UINTVAL)(1 << 0)   /* trace system areads and stack */
 #define DOD_trace_normal        (UINTVAL)(1 << 0)   /* the same */
 #define DOD_lazy_FLAG           (UINTVAL)(1 << 1)   /* timely destruction run */
-#define DOD_finish_FLAG         (UINTVAL)(1 << 2)   /* run async past sweep */
+#define DOD_finish_FLAG         (UINTVAL)(1 << 2)   /* on Parrot exit: mark (almost) all PMCs dead and */
+                                                    /* garbage collect. */
 #define DOD_no_trace_volatile_roots (UINTVAL)(1 << 3)
             /* trace all but volatile root set, i.e. registers */
 
diff --git a/src/inter_create.c b/src/inter_create.c
index 51c355d..307fa71 100644
--- a/src/inter_create.c
+++ b/src/inter_create.c
@@ -314,6 +314,14 @@ Parrot_really_destroy(PARROT_INTERP, SHIM(int exit_code), SHIM(void *arg))
      */
     interp->arena_base->DOD_block_level =
         interp->arena_base->GC_block_level = 0;
+
+    if (Interp_trace_TEST(interp, ~0)) {
+        PIO_eprintf(interp, "ParrotIO objects (like stdout and stderr) are about to be closed, so clearing trace flags.\n");
+        Interp_trace_CLEAR(interp, ~0);
+    }
+
+    /* Destroys all PMCs, even constants and the ParrotIO objects for
+     * std{in,out,err}. So we better not try to be verbose about DOD'ing. */
     Parrot_do_dod_run(interp, DOD_finish_FLAG);
 
 #if STM_PROFILE

Reply via email to