REmbed::~REmbed() { R_dot_Last(); R_RunExitFinalizers(); R_CleanTempDir(); Rf_endEmbeddedR(0); }
/* littler exit */ void littler_CleanUp(SA_TYPE saveact, int status, int runLast){ R_dot_Last(); R_RunExitFinalizers(); if (perSessionTempDir) R_CleanTempDir(); fpu_setup(FALSE); Rf_endEmbeddedR(0); exit(status); }
/* use fatal !=0 for emergency bail out */ void Rf_endEmbeddedR(int fatal) { R_RunExitFinalizers(); CleanEd(); if(!fatal) KillAllDevices(); R_CleanTempDir(); if(!fatal && R_CollectWarnings) PrintWarnings(); /* from device close and .Last */ fpu_setup(FALSE); }
RInside::~RInside() { // now empty as MemBuf is internal R_dot_Last(); R_RunExitFinalizers(); R_CleanTempDir(); //Rf_KillAllDevices(); //#ifndef WIN32 //fpu_setup(FALSE); //#endif Rf_endEmbeddedR(0); instance_m = 0 ; delete global_env_m; }
RInside::~RInside() { // now empty as MemBuf is internal logTxt("RInside::dtor BEGIN", verbose); R_dot_Last(); R_RunExitFinalizers(); R_CleanTempDir(); //Rf_KillAllDevices(); //#ifndef WIN32 //fpu_setup(FALSE); //#endif Rf_endEmbeddedR(0); logTxt("RInside::dtor END", verbose); instance_ = 0 ; }
/* use fatal !=0 for emergency bail out */ void Rf_endEmbeddedR(int fatal) { R_RunExitFinalizers(); CleanEd(); R_CleanTempDir(); if(!fatal){ Rf_KillAllDevices(); AllDevicesKilled = TRUE; } if(!fatal && R_CollectWarnings) PrintWarnings(); /* from device close and .Last */ app_cleanup(); }
void R_CleanUp(SA_TYPE saveact, int status, int runLast) { if(saveact == SA_DEFAULT) /* The normal case apart from R_Suicide */ saveact = SaveAction; if(saveact == SA_SAVEASK) { if(R_Interactive) { switch (R_YesNoCancel(G_("Save workspace image?"))) { case YES: saveact = SA_SAVE; break; case NO: saveact = SA_NOSAVE; break; case CANCEL: // There might be residual events with destroyed handles R_ProcessEvents(); jump_to_toplevel(); break; } } else saveact = SaveAction; } switch (saveact) { case SA_SAVE: if(runLast) R_dot_Last(); if(R_DirtyImage) R_SaveGlobalEnv(); if (CharacterMode == RGui) { R_setupHistory(); /* re-read the history size and filename */ wgl_savehistory(R_HistoryFile, R_HistorySize); } else if(R_Interactive && CharacterMode == RTerm) { R_setupHistory(); /* re-read the history size and filename */ gl_savehistory(R_HistoryFile, R_HistorySize); } break; case SA_NOSAVE: if(runLast) R_dot_Last(); break; case SA_SUICIDE: default: break; } R_RunExitFinalizers(); editorcleanall(); CleanEd(); KillAllDevices(); /* Unix does not do this under SA_SUICIDE */ AllDevicesKilled = TRUE; /* used in devWindows.c to inhibit callbacks */ R_CleanTempDir(); /* changes directory */ if (R_Interactive && CharacterMode == RTerm) SetConsoleTitle(oldtitle); if (R_CollectWarnings && saveact != SA_SUICIDE && CharacterMode == RTerm) /* no point in doing this for Rgui as the console is about to close */ PrintWarnings(); /* from device close and (if run) .Last */ app_cleanup(); RConsole = NULL; if(ifp) fclose(ifp); /* input file from -f or --file= */ if(ifile[0]) unlink(ifile); /* input file from -e */ exit(status); }
void attribute_hidden Rstd_CleanUp(SA_TYPE saveact, int status, int runLast) { if(saveact == SA_DEFAULT) /* The normal case apart from R_Suicide */ saveact = SaveAction; if(saveact == SA_SAVEASK) { if(R_Interactive) { unsigned char buf[1024]; qask: R_ClearerrConsole(); R_FlushConsole(); int res = R_ReadConsole("Save workspace image? [y/n/c]: ", buf, 128, 0); if(res) { switch (buf[0]) { case 'y': case 'Y': saveact = SA_SAVE; break; case 'n': case 'N': saveact = SA_NOSAVE; break; case 'c': case 'C': jump_to_toplevel(); break; default: goto qask; } } else saveact = SA_NOSAVE; /* probably EOF */ } else saveact = SaveAction; } switch (saveact) { case SA_SAVE: if(runLast) R_dot_Last(); if(R_DirtyImage) R_SaveGlobalEnv(); #ifdef HAVE_LIBREADLINE # ifdef HAVE_READLINE_HISTORY_H if(R_Interactive && UsingReadline) { int err; R_setupHistory(); /* re-read the history size and filename */ stifle_history(R_HistorySize); err = write_history(R_HistoryFile); if(err) warning(_("problem in saving the history file '%s'"), R_HistoryFile); } # endif /* HAVE_READLINE_HISTORY_H */ #endif /* HAVE_LIBREADLINE */ break; case SA_NOSAVE: if(runLast) R_dot_Last(); break; case SA_SUICIDE: default: break; } R_RunExitFinalizers(); CleanEd(); if(saveact != SA_SUICIDE) KillAllDevices(); R_CleanTempDir(); if(saveact != SA_SUICIDE && R_CollectWarnings) PrintWarnings(); /* from device close and (if run) .Last */ if(ifp) fclose(ifp); /* input file from -f or --file= */ fpu_setup(FALSE); exit(status); }
static void sigactionSegv(int signum, siginfo_t *ip, void *context) { char *s; /* First check for stack overflow if we know the stack position. We assume anything within 16Mb beyond the stack end is a stack overflow. */ if(signum == SIGSEGV && (ip != (siginfo_t *)0) && (intptr_t) R_CStackStart != -1) { uintptr_t addr = (uintptr_t) ip->si_addr; intptr_t diff = (R_CStackDir > 0) ? R_CStackStart - addr: addr - R_CStackStart; uintptr_t upper = 0x1000000; /* 16Mb */ if((intptr_t) R_CStackLimit != -1) upper += R_CStackLimit; if(diff > 0 && diff < upper) { REprintf(_("Error: segfault from C stack overflow\n")); jump_to_toplevel(); } } /* need to take off stack checking as stack base has changed */ R_CStackLimit = (uintptr_t)-1; /* Do not translate these messages */ REprintf("\n *** caught %s ***\n", signum == SIGILL ? "illegal operation" : signum == SIGBUS ? "bus error" : "segfault"); if(ip != (siginfo_t *)0) { if(signum == SIGILL) { switch(ip->si_code) { #ifdef ILL_ILLOPC case ILL_ILLOPC: s = "illegal opcode"; break; #endif #ifdef ILL_ILLOPN case ILL_ILLOPN: s = "illegal operand"; break; #endif #ifdef ILL_ILLADR case ILL_ILLADR: s = "illegal addressing mode"; break; #endif #ifdef ILL_ILLTRP case ILL_ILLTRP: s = "illegal trap"; break; #endif #ifdef ILL_COPROC case ILL_COPROC: s = "coprocessor error"; break; #endif default: s = "unknown"; break; } } else if(signum == SIGBUS) switch(ip->si_code) { #ifdef BUS_ADRALN case BUS_ADRALN: s = "invalid alignment"; break; #endif #ifdef BUS_ADRERR /* not on MacOS X, apparently */ case BUS_ADRERR: s = "non-existent physical address"; break; #endif #ifdef BUS_OBJERR /* not on MacOS X, apparently */ case BUS_OBJERR: s = "object specific hardware error"; break; #endif default: s = "unknown"; break; } else switch(ip->si_code) { #ifdef SEGV_MAPERR case SEGV_MAPERR: s = "memory not mapped"; break; #endif #ifdef SEGV_ACCERR case SEGV_ACCERR: s = "invalid permissions"; break; #endif default: s = "unknown"; break; } REprintf("address %p, cause '%s'\n", ip->si_addr, s); } { /* A simple customized print of the traceback */ SEXP trace, p, q; int line = 1, i; PROTECT(trace = R_GetTraceback(0)); if(trace != R_NilValue) { REprintf("\nTraceback:\n"); for(p = trace; p != R_NilValue; p = CDR(p), line++) { q = CAR(p); /* a character vector */ REprintf("%2d: ", line); for(i = 0; i < LENGTH(q); i++) REprintf("%s", CHAR(STRING_ELT(q, i))); REprintf("\n"); } UNPROTECT(1); } } if(R_Interactive) { REprintf("\nPossible actions:\n1: %s\n2: %s\n3: %s\n4: %s\n", "abort (with core dump, if enabled)", "normal R exit", "exit R without saving workspace", "exit R saving workspace"); while(1) { if(R_ReadConsole("Selection: ", ConsoleBuf, CONSOLE_BUFFER_SIZE, 0) > 0) { if(ConsoleBuf[0] == '1') break; if(ConsoleBuf[0] == '2') R_CleanUp(SA_DEFAULT, 0, 1); if(ConsoleBuf[0] == '3') R_CleanUp(SA_NOSAVE, 70, 0); if(ConsoleBuf[0] == '4') R_CleanUp(SA_SAVE, 71, 0); } } } REprintf("aborting ...\n"); R_CleanTempDir(); /* now do normal behaviour, e.g. core dump */ signal(signum, SIG_DFL); raise(signum); }