# New Ticket Created by Jerry Gay
# Please include the string: [perl #44393]
# in the subject line of all future correspondence about this issue.
# URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44393
i'm having trouble on x86_64. when running a 32bit parrot, i get
occasional deadlock at the OS level, after Parrot_exit. when running a
64bit parrot, it segfaults within Parrot_exit, while running the exit
handlers. if i run with -G, no segfault.
a comment in the source notes that disabling dod/gc may be a good
thing to do, since gc during interpreter teardown could lead to Bad
Things. sounds like that's a valid note, and addressing it will fix my
problems.
so, i try a patch:
===
Index: src/exit.c
===
--- src/exit.c (revision 20461)
+++ src/exit.c (working copy)
@@ -70,6 +70,9 @@
* and: interp-exit_handler_list is gone, after the last exit handler
* (Parrot_really_destroy) has run
*/
+Parrot_block_DOD(interp);
+Parrot_block_GC(interp);
+
handler_node_t *node = interp-exit_handler_list;
while (node) {
handler_node_t * const next = node-next;
===
but that gives me compile errors:
===
src\exit.c
src\exit.c(76) : error C2275: 'handler_node_t' : illegal use of this type as an
expression
c:\usr\local\parrot\trunk\include\parrot/exit.h(25) : see declaration of
'handler_node_t'
src\exit.c(76) : error C2065: 'node' : undeclared identifier
src\exit.c(78) : error C2223: left of '-next' must point to struct/union
src\exit.c(80) : error C2223: left of '-function' must point to struct/union
src\exit.c(80) : error C2223: left of '-arg' must point to struct/union
src\exit.c(81) : warning C4022: 'mem_sys_free' : pointer mismatch for actual par
ameter 1
src\exit.c(82) : warning C4047: '=' : 'int' differs in levels of indirection fro
m 'handler_node_t *const '
===
huh? something must be funny in these macros. a naive workaround:
===
Index: src/exit.c
===
--- src/exit.c (revision 20461)
+++ src/exit.c (working copy)
@@ -70,6 +70,10 @@
* and: interp-exit_handler_list is gone, after the last exit handler
* (Parrot_really_destroy) has run
*/
+Parrot_block_DOD(interp);
+Parrot_block_GC(interp);
+
+{
handler_node_t *node = interp-exit_handler_list;
while (node) {
handler_node_t * const next = node-next;
@@ -78,7 +82,7 @@
mem_sys_free(node);
node = next;
}
-
+}
exit(status);
}
===
compiles without error.
what's going on here? i have i feeling i'm close to fixing this
annoying bug, but now i've got to dive into two or three levels of
hate, and i really want to start my weekend.
so, that's what i'm going to do. feel free to beat me to fixing this
before i pick up on it again next week, please!
~jerry