From: Matt Birkholz Date: Wed, 27 Aug 2014 05:27:38 +0000 (-0700) Subject: microcode/unix: fix continue_from_trap to freak out (force GC) less X-Git-Tag: mit-scheme-pucked-9.2.12~401^2~1 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=4fafc74344456be993b42c7270f840bc23ea1d2c;p=mit-scheme.git microcode/unix: fix continue_from_trap to freak out (force GC) less The classify_pc function returns pcl_unknown for traps in shared libraries, e.g. in feraiseexcept (in the raise-float-exceptions primitive) or any callout (in the c-call primitive). This new continue_from_trap function is less conservative, ignoring the pcl_unknown result from classify_pc when the stack_pointer, Free and PRIMITIVE registers all look good. This eliminated all complaints during `make check' about "resetting bogus Free" (not the actual problem), representing 14 unnecessarily forced GCs. Also, fix the murmur about "resetting bogus Free". Correct it for accuracy and so that it must be turned on with the ((make-primitive-procedure 'SET-DEBUG-FLAGS! 2) 9 #t) --- diff --git a/src/microcode/uxtrap.c b/src/microcode/uxtrap.c index 511f112e2..6e7db83ba 100644 --- a/src/microcode/uxtrap.c +++ b/src/microcode/uxtrap.c @@ -391,6 +391,23 @@ continue_from_trap (int signo, SIGINFO_T info, SIGCONTEXT_T * scp) #endif case pcl_unknown: + if (((OBJECT_TYPE (primitive)) == TC_PRIMITIVE) + && (ADDRESS_IN_STACK_P (stack_pointer)) && (ALIGNED_P (stack_pointer)) + && (ADDRESS_IN_HEAP_P (Free)) && (ALIGNED_P (Free))) + { +#ifdef ENABLE_DEBUGGING_TOOLS + if (GC_Debug == true) + { + /* Note where this presumption is employed. */ + outf_error (";Warning: trap at 0x%lx assumed a primitive\n", pc); + outf_flush_error (); + } +#endif + new_sp = stack_pointer; + SET_RECOVERY_INFO + (STATE_PRIMITIVE, primitive, (ULONG_TO_FIXNUM (GET_LEXPR_ACTUALS))); + break; + } new_sp = 0; SET_RECOVERY_INFO (STATE_UNKNOWN, @@ -409,8 +426,13 @@ continue_from_trap (int signo, SIGINFO_T info, SIGCONTEXT_T * scp) && (ALIGNED_P (Free)))) { #ifdef ENABLE_DEBUGGING_TOOLS - outf_error ("Resetting bogus Free in continue_from_trap.\n"); - outf_flush_error (); + if (GC_Debug == true) + { + outf_error ((new_sp == 0) + ? ";Warning: bogus stack_pointer in continue_from_trap\n" + : ";Warning: bogus Free in continue_from_trap\n"); + outf_flush_error (); + } #endif Free = heap_alloc_limit; }