static void __cdecl doexit ( int code, int quick, int retcaller ) { #ifdef _DEBUG static int fExit = 0; #endif /* _DEBUG */
#ifdef CRTDLL if (!retcaller && check_managed_app()) { /* Only if the EXE is managed then we call CorExitProcess. Native cleanup is done in .cctor of the EXE If the Exe is Native then native clean up should be done before calling (Cor)ExitProcess. */ __crtCorExitProcess(code); } #endif /* CRTDLL */
_lockexit(); /* assure only 1 thread in exit path */ __TRY
if (_C_Exit_Done != TRUE) { _C_Termination_Done = TRUE;
/* save callable exit flag (for use by terminators) */ _exitflag = (char) retcaller; /* 0 = term, !0 = callable exit */
if (!quick) {
/* * do _onexit/atexit() terminators * (if there are any) * * These terminators MUST be executed in reverse order (LIFO)! * * NOTE: * This code assumes that __onexitbegin points * to the first valid onexit() entry and that * __onexitend points past the last valid entry. * If __onexitbegin == __onexitend, the table * is empty and there are no routines to call. */