From 903b3050a73a1e6fbfa9c21fb29822dc9c9060d9 Mon Sep 17 00:00:00 2001 From: shikokuchuo <53399081+shikokuchuo@users.noreply.github.com> Date: Fri, 25 Oct 2024 22:37:22 +0100 Subject: [PATCH] have cancellation function return invisibly for consistency with later() --- src/fd.cpp | 4 ++-- src/init.c | 4 +++- tests/testthat/test-later-fd.R | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/fd.cpp b/src/fd.cpp index fe3fda2..960cf09 100644 --- a/src/fd.cpp +++ b/src/fd.cpp @@ -26,6 +26,7 @@ inline SEXP R_mkClosure(SEXP formals, SEXP body, SEXP env) { extern CallbackRegistryTable callbackRegistryTable; extern SEXP later_fdcancel; +extern SEXP later_invisibleSymbol; #ifdef _WIN32 #define POLL_FUNC WSAPoll @@ -205,9 +206,8 @@ Rcpp::RObject execLater_fd(Rcpp::Function callback, Rcpp::IntegerVector readfds, tct_thrd_detach(thr); Rcpp::XPtr>> xptr(new std::shared_ptr>(flag), true); - SEXP body, func; - PROTECT(body = Rf_lcons(later_fdcancel, Rf_cons(xptr, R_NilValue))); + PROTECT(body = Rf_lang2(later_invisibleSymbol, Rf_lang2(later_fdcancel, xptr))); func = R_mkClosure(R_NilValue, body, R_BaseEnv); UNPROTECT(1); diff --git a/src/init.c b/src/init.c index 41436d4..022590f 100644 --- a/src/init.c +++ b/src/init.c @@ -5,8 +5,9 @@ #include // for uint64_t // Symbols and preserved objects defined here. -SEXP later_laterSymbol; SEXP later_fdcancel; +SEXP later_invisibleSymbol; +SEXP later_laterSymbol; /* FIXME: Check these declarations against the C/Fortran source code. @@ -63,6 +64,7 @@ uint64_t execLaterNative2(void (*func)(void*), void* data, double secs, int loop int apiVersion(void); void PreserveObjects(void) { + later_invisibleSymbol = Rf_install("invisible"); later_laterSymbol = Rf_install("later"); R_PreserveObject(later_fdcancel = Rf_lang3(R_TripleColonSymbol, later_laterSymbol, Rf_install("fd_cancel"))); } diff --git a/tests/testthat/test-later-fd.R b/tests/testthat/test-later-fd.R index 4f3dfa7..9af904a 100644 --- a/tests/testthat/test-later-fd.R +++ b/tests/testthat/test-later-fd.R @@ -23,6 +23,7 @@ test_that("later_fd", { expect_true(cancel()) Sys.sleep(0.25) expect_false(cancel()) + expect_invisible(cancel()) run_now() expect_null(result)