Date: Sunday, December 19, 2010 @ 23:12:58
Author: rtoy
Path: /project/cmucl/cvsroot/src/lisp
Tag: cross-sol-x86-branch
Modified: gencgc.c
o Turn GC_ASSERTIONS for now.
o Turn off other verbose checking and debugging.
o In scav_closure_header, check if the closure function is zero and
skip scavenging it if so. Only do this for solaris/x86; it doesn't
seem to be a problem on other OSes. But leave some of the debugging
stuff around but disabled for now, just in case.
----------+
gencgc.c | 55 ++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 11 deletions(-)
Index: src/lisp/gencgc.c
diff -u src/lisp/gencgc.c:1.110.6.1 src/lisp/gencgc.c:1.110.6.2
--- src/lisp/gencgc.c:1.110.6.1 Wed Dec 15 07:53:45 2010
+++ src/lisp/gencgc.c Sun Dec 19 23:12:57 2010
@@ -7,7 +7,7 @@
*
* Douglas Crosher, 1996, 1997, 1998, 1999.
*
- * $Header: /project/cmucl/cvsroot/src/lisp/gencgc.c,v 1.110.6.1 2010-12-15 12:53:45 rtoy Exp $
+ * $Header: /project/cmucl/cvsroot/src/lisp/gencgc.c,v 1.110.6.2 2010-12-20 04:12:57 rtoy Exp $
*
*/
@@ -150,8 +150,7 @@
/* Define for activating assertions. */
-#define GC_ASSERTIONS 1
-#if defined(DARWIN)
+#if defined(x86) && defined(SOLARIS)
#define GC_ASSERTIONS 1
#endif
@@ -241,7 +240,7 @@
* The verbose level. All non-error messages are disabled at level 0;
* and only a few rare messages are printed at level 1.
*/
-unsigned gencgc_verbose = 1;
+unsigned gencgc_verbose = 0;
unsigned counters_verbose = 0;
/*
@@ -267,7 +266,7 @@
* makes GC very, very slow, so don't enable this unless you really
* need it!)
*/
-boolean pre_verify_gen_0 = TRUE;
+boolean pre_verify_gen_0 = FALSE;
/*
* Enable checking for bad pointers after gc_free_heap called from purify.
@@ -275,7 +274,7 @@
#if 0 && defined(DARWIN)
boolean verify_after_free_heap = TRUE;
#else
-boolean verify_after_free_heap = TRUE;
+boolean verify_after_free_heap = FALSE;
#endif
/*
@@ -288,7 +287,7 @@
* Enable the checking of code objects for fixup errors after they are
* transported. (Only used for x86.)
*/
-boolean check_code_fixups = TRUE;
+boolean check_code_fixups = FALSE;
/*
* To enable unmapping of a page and re-mmaping it to have it zero filled.
@@ -308,8 +307,8 @@
boolean gencgc_zero_check = TRUE;
boolean gencgc_enable_verify_zero_fill = TRUE;
#else
-boolean gencgc_zero_check = TRUE;
-boolean gencgc_enable_verify_zero_fill = TRUE;
+boolean gencgc_zero_check = FALSE;
+boolean gencgc_enable_verify_zero_fill = FALSE;
#endif
/*
@@ -319,7 +318,7 @@
#if 0 && defined(DARWIN)
boolean gencgc_zero_check_during_free_heap = TRUE;
#else
-boolean gencgc_zero_check_during_free_heap = TRUE;
+boolean gencgc_zero_check_during_free_heap = FALSE;
#endif
/*
@@ -3445,12 +3444,46 @@
closure = (struct closure *) where;
fun = closure->function - RAW_ADDR_OFFSET;
+#if !(defined(x86) && defined(SOLARIS)
scavenge(&fun, 1);
/* The function may have moved so update the raw address. But don't
write unnecessarily. */
if (closure->function != fun + RAW_ADDR_OFFSET)
closure->function = fun + RAW_ADDR_OFFSET;
-
+#else
+ /*
+ * For some reason, on solaris/x86, we get closures (actually, it
+ * appears to be funcallable instances where the closure function
+ * is zero. I don't know why, but they are. They don't seem to
+ * be created anywhere and it doesn't seem to be caused by GC
+ * transport.
+ *
+ * Anyway, we check for zero and skip scavenging if so.
+ * (Previously, we'd get a segfault scavenging the object at
+ * address -RAW_ADDR_OFFSET.
+ */
+ if (fun) {
+ scavenge(&fun, 1);
+ /*
+ * The function may have moved so update the raw address. But don't
+ * write unnecessarily.
+ */
+ if (closure->function != fun + RAW_ADDR_OFFSET) {
+#if 0
+ fprintf(stderr, "closure header 0x%04x moved from %p to %p\n",
+ closure->header, (void*) closure->function, (void*) (fun + RAW_ADDR_OFFSET));
+#endif
+ closure->function = fun + RAW_ADDR_OFFSET;
+ }
+ }
+#if 0
+ else {
+ fprintf(stderr, "Weird closure!\n");
+ fprintf(stderr, " where = %p, object = 0x%04x\n", where, object);
+ fprintf(stderr, " closure->function = %p, fun = %p\n", closure->function, fun);
+ }
+#endif
+#endif
return 2;
}