/** R-level entry point to remove an entry from the list of top-level callbacks. 'which' should be an integer and give us the 0-based index of the element to be removed from the list. @see Rf_RemoveToplevelCallbackByIndex(int) */ SEXP R_removeTaskCallback(SEXP which) { int id; Rboolean val; if(TYPEOF(which) == STRSXP) { val = Rf_removeTaskCallbackByName(CHAR(STRING_ELT(which, 0))); } else { id = asInteger(which); if (id != NA_INTEGER) val = Rf_removeTaskCallbackByIndex(id - 1); else val = FALSE; } return ScalarLogical(val); }
void nvimcom_Stop() { #ifndef WIN32 if(ih){ removeInputHandler(&R_InputHandlers, ih); close(ifd); close(ofd); } #endif if(nvimcom_initialized){ Rf_removeTaskCallbackByName("NVimComHandler"); #ifdef WIN32 closesocket(sfd); WSACleanup(); #else close(sfd); pthread_cancel(tid); pthread_join(tid, NULL); #endif ListStatus *tmp = firstList; while(tmp){ firstList = tmp->next; free(tmp->key); free(tmp); tmp = firstList; } for(int i = 0; i < 64; i++){ free(loadedlibs[i]); loadedlibs[i] = NULL; } if(obbrbuf1) free(obbrbuf1); if(obbrbuf2) free(obbrbuf2); if(verbose) REprintf("nvimcom stopped\n"); } nvimcom_initialized = 0; }