static void termination_prefix (int code) { attempt_termination_backout (code); OS_restore_external_state (); /* TERM_HALT is not an error condition and thus its termination message should be considered normal output. */ if (code == TERM_HALT) { if (!option_batch_mode) { outf_console ("\n%s.\n", (term_messages[code])); outf_flush_console (); } } else { #ifdef USING_MESSAGE_BOX_FOR_FATAL_OUTPUT outf_fatal ("Reason for termination:"); #endif outf_fatal ("\n"); { const char * msg = 0; if ((code >= 0) && (code <= MAX_TERMINATION)) msg = (term_messages[code]); if (msg == 0) outf_fatal ("Unknown termination code %#x", code); else outf_fatal ("%s", msg); } if (WITHIN_CRITICAL_SECTION_P ()) outf_fatal (" within critical section \"%s\"", (CRITICAL_SECTION_NAME ())); outf_fatal ("."); #ifndef USING_MESSAGE_BOX_FOR_FATAL_OUTPUT outf_fatal ("\n"); #endif } }
static void create_gdi_syslevel_cs(void) { _CreateSysLevel( &GDI_level, 3 ); CRITICAL_SECTION_NAME( &GDI_level.crst, "GDI_level" ); }
void TIME_Init(void) { RtlInitializeCriticalSection( &TIME_sync_cs ); CRITICAL_SECTION_NAME( &TIME_sync_cs, "TIME_sync_cs" ); }
void create_user_syslevel_cs(void) { _CreateSysLevel( &USER_SysLevel, 2 ); CRITICAL_SECTION_NAME( &USER_SysLevel.crst, "USER_SysLevel" ); }
void trap_handler (const char * message, int signo, SIGINFO_T info, SIGCONTEXT_T * scp) { int code = ((SIGINFO_VALID_P (info)) ? (SIGINFO_CODE (info)) : 0); bool stack_overflowed_p = (STACK_OVERFLOWED_P ()); enum trap_state old_trap_state = trap_state; if (old_trap_state == trap_state_exitting_hard) _exit (1); if (old_trap_state == trap_state_exitting_soft) trap_immediate_termination (); trap_state = trap_state_trapped; if (WITHIN_CRITICAL_SECTION_P ()) { fprintf (stdout, "\n>> A %s has occurred within critical section \"%s\".\n", message, (CRITICAL_SECTION_NAME ())); fprintf (stdout, ">> [signal %d (%s), code %d]\n", signo, (find_signal_name (signo)), code); } else if (stack_overflowed_p || (old_trap_state != trap_state_recover)) { fprintf (stdout, "\n>> A %s has occurred.\n", message); fprintf (stdout, ">> [signal %d (%s), code %d]\n", signo, (find_signal_name (signo)), code); } if (stack_overflowed_p) { fputs (">> The stack has overflowed overwriting adjacent memory.\n", stdout); fputs (">> This was probably caused by a runaway recursion.\n", stdout); } fflush (stdout); switch (old_trap_state) { case trap_state_trapped: if ((saved_trap_state == trap_state_recover) || (saved_trap_state == trap_state_query)) { fprintf (stdout, ">> The trap occurred while processing an earlier trap.\n"); fprintf (stdout, ">> [The earlier trap raised signal %d (%s), code %d.]\n", saved_signo, (find_signal_name (saved_signo)), ((SIGINFO_VALID_P (saved_info)) ? (SIGINFO_CODE (saved_info)) : 0)); fprintf (stdout, ">> Successful recovery is %sunlikely.\n", ((WITHIN_CRITICAL_SECTION_P ()) ? "extremely " : "")); } else trap_immediate_termination (); break; case trap_state_recover: if ((WITHIN_CRITICAL_SECTION_P ()) || stack_overflowed_p) fprintf (stdout, ">> Successful recovery is unlikely.\n"); else { saved_trap_state = old_trap_state; saved_signo = signo; saved_info = info; saved_scp = scp; trap_recover (); } break; case trap_state_exit: termination_trap (); break; default: break; } fflush (stdout); saved_trap_state = old_trap_state; saved_signo = signo; saved_info = info; saved_scp = scp; while (1) { static const char * trap_query_choices[] = { "D = dump core", "I = terminate immediately", "N = terminate normally", "R = attempt recovery", "Q = terminate normally", 0 }; switch (userio_choose_option ("Choose one of the following actions:", "Action -> ", trap_query_choices)) { case 'I': trap_immediate_termination (); break; case 'D': trap_dump_core (); break; case '\0': /* Error in IO. Assume everything scrod. */ case 'N': case 'Q': trap_normal_termination (); break; case 'R': trap_recover (); break; } } }