+
+#if QSHOW
+static void
+configurable_lossage_handler()
+{
+ void lisp_backtrace(int frames);
+
+ if (dyndebug_config.dyndebug_backtrace_when_lost) {
+ fprintf(stderr, "lose: backtrace follows as requested\n");
+ lisp_backtrace(100);
+ }
+
+ if (dyndebug_config.dyndebug_sleep_when_lost) {
+ fprintf(stderr,
+"The system is too badly corrupted or confused to continue at the Lisp.\n"
+"level. The monitor was enabled, but you requested `sleep_when_lost'\n"
+"behaviour though dyndebug. To help with your debugging effort, this\n"
+"thread will not enter the monitor, and instead proceed immediately to an\n"
+"infinite sleep call, maximizing your chances that the thread's current\n"
+"state can be preserved until you attach an external debugger. Good luck!\n");
+ for (;;)
+# ifdef LISP_FEATURE_WIN32
+ Sleep(10000);
+# else
+ sleep(10);
+# endif
+ }
+
+ monitor_or_something();
+}
+#endif
+
+void enable_lossage_handler(void)
+{
+#if QSHOW
+ lossage_handler = configurable_lossage_handler;
+#else
+ lossage_handler = monitor_or_something;
+#endif
+}
+void disable_lossage_handler(void)
+{
+ lossage_handler = default_lossage_handler;
+}
+
+static
+void print_message(char *fmt, va_list ap)
+{
+ fprintf(stderr, " in SBCL pid %d",getpid());
+#if defined(LISP_FEATURE_SB_THREAD)
+ fprintf(stderr, "(tid %lu)", (uword_t) thread_self());
+#endif
+ if (fmt) {
+ fprintf(stderr, ":\n");
+ vfprintf(stderr, fmt, ap);
+ }
+ fprintf(stderr, "\n");
+}
+
+static inline void
+call_lossage_handler() never_returns;
+
+static inline void
+call_lossage_handler()