int master_main(Master* M) { ExceptionScope exScope; int volatile ret = 0; int ex; exception_begin_try(B(M), &exScope); switch ((ex = exception_try(B(M)))) { case Try: master_init(M); master_start_log_writer(M); master_start_login(M); master_start_char_select(M); // Start the IPC thread now to avoid needing to hold the lock while the above processes start master_start_ipc_thread(M); master_main_loop(M); break; case Finally: master_deinit(M); break; default: printf(TERM_RED "[master_main] Unhandled exception (%i): %s\n" TERM_DEFAULT, ex, string_data(exception_get_message(B(M)))); exception_handled(B(M)); ret = ex; break; } exception_end_try_with_finally(B(M)); return ret; }
int console_receive(MasterIpcThread* ipcThread, Master* M, ChildProcess* proc, int sourceId, IpcPacket* packet) { ExceptionScope exScope; Console* volatile console = NULL; int volatile ret = false; int ex; exception_begin_try(B(ipcThread), &exScope); switch ((ex = exception_try(B(ipcThread)))) { case Try: ret = console_do_receive(ipcThread, M, proc, sourceId, packet, &console); break; default: if (console) console_destroy(console); log_format(B(ipcThread), LogError, "[console_receive] Error (%i): %s", ex, string_data(exception_message(B(ipcThread)))); exception_handled(B(ipcThread)); break; } exception_end_try(B(ipcThread)); return ret; }
int log_main(LogWriter* logWriter, const char* ipcPath) { ExceptionScope exScope; int volatile ret = 0; int ex; exception_begin_try(B(logWriter), &exScope); switch ((ex = exception_try(B(logWriter)))) { case Try: log_writer_init(logWriter, ipcPath); log_writer_main_loop(logWriter); break; case Finally: log_writer_deinit(logWriter); break; default: printf("[log_main] Unhandled exception (%i): %s\n", ex, string_data(exception_get_message(B(logWriter)))); exception_handled(B(logWriter)); ret = ex; break; } exception_end_try_with_finally(B(logWriter)); return ret; }
DECLARE_TEST(exception, exception_handler) { int result; if (system_debugger_attached() || (system_platform() == PLATFORM_PNACL)) return 0; //Don't do exception tests with debugger attached _exception_handler_called = false; log_enable_stdout(false); result = exception_try(raise_abort, 0, test_local_exception_handler, STRING_CONST("raise_abort")); log_enable_stdout(true); EXPECT_EQ(result, FOUNDATION_EXCEPTION_CAUGHT); EXPECT_TRUE(_exception_handler_called); return 0; }