Skip to content

Commit 75a8802

Browse files
Merge branch 'release/0.10.1'
2 parents 60b89ea + 1360a28 commit 75a8802

File tree

10 files changed

+210
-119
lines changed

10 files changed

+210
-119
lines changed

.github/workflows/R-CMD-check.yaml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ jobs:
1919
- {os: windows-latest, r: 'devel' }
2020
- {os: windows-latest, r: 'release' }
2121
- {os: windows-latest, r: 'oldrel' }
22-
# - {os: macOS-latest, r: 'devel' }
22+
- {os: macOS-latest, r: 'devel' }
2323
- {os: macOS-latest, r: 'release' }
24-
# - {os: macOS-latest, r: 'oldrel' }
25-
# - {os: ubuntu-latest, r: 'devel' }
24+
- {os: macOS-latest, r: 'oldrel' }
25+
- {os: ubuntu-latest, r: 'devel' }
2626
- {os: ubuntu-latest, r: 'release' }
2727
- {os: ubuntu-latest, r: 'oldrel' }
2828
- {os: ubuntu-latest, r: 'oldrel-1' }
@@ -34,6 +34,7 @@ jobs:
3434
- {os: ubuntu-latest, r: 'release' , language: ko, label: ko }
3535
- {os: ubuntu-latest, r: 'release' , language: zh_CN, label: zh_CN }
3636
- {os: ubuntu-latest, r: 'release' , language: zh_TW, label: zh_TW }
37+
- {os: windows-latest, r: 'devel', future_version: develop, label: 'w/ future-develop' }
3738

3839
env:
3940
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
@@ -53,6 +54,7 @@ jobs:
5354
## Specific to futures
5455
R_PARALLELLY_AVAILABLECORES_SYSTEM: ${{ matrix.config.availablecores }}
5556
R_FUTURE_RNG_ONMISUSE: error
57+
R_FUTURE_VERSION: ${{ matrix.config.future_version }}
5658

5759
steps:
5860
- uses: actions/checkout@v4
@@ -77,6 +79,15 @@ jobs:
7779
install.packages(".", repos = NULL, type = "source") ## needed by parallel workers
7880
shell: Rscript {0}
7981

82+
- name: Test with specific future version?
83+
run: |
84+
future_version <- Sys.getenv("R_FUTURE_VERSION")
85+
if (nzchar(future_version)) {
86+
install.packages("remotes")
87+
remotes::install_github("futureverse/future", ref=future_version)
88+
}
89+
shell: Rscript {0}
90+
8091
- name: Session info
8192
run: |
8293
options(width = 100)

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: future.callr
2-
Version: 0.10.0
2+
Version: 0.10.1
33
Depends:
44
R (>= 3.4.0),
55
future (>= 1.58.0)

NEWS.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
# Version 0.10.1 [2025-07-10]
2+
3+
## Bug Fixes
4+
5+
* `resolved()` for callr futures could throw a `FutureError` in some
6+
cases, e.g. a `FutureInterruptError` if the future was terminated
7+
abruptly.
8+
9+
110
# Version 0.10.0 [2025-06-05]
211

312
## New Features

R/CallrFutureBackend-class.R

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -264,33 +264,51 @@ print.CallrFuture <- function(x, ...) {
264264
#' @keywords internal
265265
#' @export
266266
resolved.CallrFuture <- function(x, .signalEarly = TRUE, ...) {
267+
resolved <- NA
268+
267269
debug <- isTRUE(getOption("future.debug"))
268270
if (debug) {
269271
mdebugf_push("resolved() for %s ...", class(x)[1])
270-
on.exit(mdebugf_pop())
272+
on.exit({
273+
mdebugf("Future state: %s", sQuote(x[["state"]]))
274+
mdebugf("Resolved: %s", resolved)
275+
mdebugf_pop()
276+
})
271277
}
272-
278+
279+
## Already resolved?
273280
resolved <- NextMethod()
281+
if (debug) mdebugf("Future state: %s", sQuote(x[["state"]]))
274282
if (resolved) return(TRUE)
275-
276-
process <- x[["process"]]
277-
if (!inherits(process, "r_process")) return(FALSE)
278-
resolved <- !process$is_alive()
279283

284+
process <- x[["process"]]
285+
alive <- local({
286+
alive <- NA
287+
if (debug) {
288+
mdebugf_push("Querying process ...")
289+
mdebugf("Process is alive: %s", alive)
290+
on.exit(mdebug_pop())
291+
}
292+
if (inherits(process, "r_process")) {
293+
alive <- process$is_alive()
294+
}
295+
alive
296+
})
297+
resolved <- (!is.na(alive) && !alive)
298+
280299
## Collect and relay immediateCondition if they exists
300+
if (debug) mdebugf_push("Collect immediate conditions ...")
281301
conditions <- readImmediateConditions(signal = TRUE)
282302
## Record conditions as signaled
283-
signaled <- c(x[[".signaledConditions"]], conditions)
284-
x[[".signaledConditions"]] <- signaled
303+
if (length(conditions) > 0) {
304+
signaled <- c(x[[".signaledConditions"]], conditions)
305+
x[[".signaledConditions"]] <- signaled
306+
}
307+
if (debug) mdebug_pop()
285308

286309
## Signal conditions early? (happens only iff requested)
287310
if (.signalEarly) signalEarly(x, ...)
288311

289-
## Signal errors early?
290-
if (.signalEarly && resolved) {
291-
## Trigger a FutureError already here, if exit code != 0
292-
if (process$get_exit_status() != 0L) result(x)
293-
}
294312
resolved
295313
}
296314

@@ -352,6 +370,7 @@ await <- function(future, ...) {
352370
debug <- isTRUE(getOption("future.debug"))
353371
if (debug) {
354372
mdebug_push("await() ...")
373+
mdebugf("Future state: %s", sQuote(future[["state"]]))
355374
on.exit(mdebug_pop())
356375
}
357376

@@ -421,7 +440,10 @@ await <- function(future, ...) {
421440

422441
## Failed?
423442
if (inherits(result, "error")) {
424-
if (debug) mdebugf_push("Received an %s ...", class(result)[1])
443+
if (debug) {
444+
mdebugf_push("Received an %s ...", class(result)[1])
445+
mprint(result)
446+
}
425447

426448
pid <- process$get_pid()
427449
exit_code <- tryCatch(process$get_exit_status(), error = function(e) NA_integer_)

R/utils-debug.R

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,63 +16,58 @@ debug_indent <- local({
1616
if (!exists(".debug", inherits = FALSE)) .debug <- new.env(parent = emptyenv())
1717
if (!"stack" %in% names(".debug")) .debug$stack <- list()
1818

19-
mdebug_push <- function(..., debug = isTRUE(getOption("future.debug"))) {
20-
if (!debug) return()
21-
msg <- mdebug(..., debug = debug)
19+
mdebug_push <- function(...) {
20+
msg <- mdebug(...)
2221
.debug$stack <- c(.debug$stack, msg)
2322
invisible(msg)
2423
}
2524

26-
mdebugf_push <- function(..., debug = isTRUE(getOption("future.debug"))) {
27-
if (!debug) return()
28-
msg <- mdebugf(..., debug = debug)
25+
mdebugf_push <- function(...) {
26+
msg <- mdebugf(...)
2927
.debug$stack <- c(.debug$stack, msg)
3028
invisible(msg)
3129
}
3230

33-
mdebug_pop <- function(..., debug = isTRUE(getOption("future.debug"))) {
34-
if (!debug) return()
31+
mdebug_pop <- function(...) {
3532
n <- length(.debug$stack)
36-
msg <- .debug$stack[n]
33+
msg <- c(...)
34+
if (length(msg) == 0) {
35+
msg <- .debug$stack[n]
36+
msg <- sprintf("%s done", msg)
37+
}
3738
.debug$stack <- .debug$stack[-n]
38-
mdebug(sprintf("%s done", msg), debug = debug)
39+
if (length(msg) == 0 || !is.na(msg)) mdebug(msg)
3940
}
4041

41-
mdebugf_pop <- function(..., debug = isTRUE(getOption("future.debug"))) {
42-
if (!debug) return()
42+
mdebugf_pop <- function(...) {
4343
n <- length(.debug$stack)
4444
msg <- .debug$stack[n]
4545
.debug$stack <- .debug$stack[-n]
46-
mdebug(sprintf("%s done", msg), debug = debug)
46+
mdebug(sprintf("%s done", msg))
4747
}
4848

49-
mdebug <- function(..., prefix = now(), debug = isTRUE(getOption("future.debug"))) {
50-
if (!debug) return()
49+
mdebug <- function(..., prefix = now()) {
5150
prefix <- paste(prefix, debug_indent(), sep = "")
5251
msg <- paste(..., sep = "")
5352
message(sprintf("%s%s", prefix, msg))
5453
invisible(msg)
5554
}
5655

57-
mdebugf <- function(..., appendLF = TRUE,
58-
prefix = now(), debug = isTRUE(getOption("future.debug"))) {
59-
if (!debug) return()
56+
mdebugf <- function(..., appendLF = TRUE, prefix = now()) {
6057
prefix <- paste(prefix, debug_indent(), sep = "")
6158
msg <- sprintf(...)
6259
message(sprintf("%s%s", prefix, msg), appendLF = appendLF)
6360
invisible(msg)
6461
}
6562

6663
#' @importFrom utils capture.output
67-
mprint <- function(..., appendLF = TRUE, prefix = now(), debug = isTRUE(getOption("future.debug"))) {
68-
if (!debug) return()
64+
mprint <- function(..., appendLF = TRUE, prefix = now()) {
6965
prefix <- paste(prefix, debug_indent(), sep = "")
7066
message(paste(prefix, capture.output(print(...)), sep = "", collapse = "\n"), appendLF = appendLF)
7167
}
7268

7369
#' @importFrom utils capture.output str
74-
mstr <- function(..., appendLF = TRUE, prefix = now(), debug = isTRUE(getOption("future.debug"))) {
75-
if (!debug) return()
70+
mstr <- function(..., appendLF = TRUE, prefix = now()) {
7671
prefix <- paste(prefix, debug_indent(), sep = "")
7772
message(paste(prefix, capture.output(str(...)), sep = "", collapse = "\n"), appendLF = appendLF)
7873
}

inst/WORDLIST

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ HenrikBengtsson
1212
ORCID
1313
RJ
1414
SOCKcluster
15+
StackOverflow
1516
Sys
1617
VignetteAuthor
1718
VignetteEngine

inst/testme/test-callr,launch-failure.R

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@ cat("stop('boom')\n", file = tf)
2222
f <- local({ opwd <- setwd(dirname(tf)); on.exit(setwd(opwd)); future(42L) })
2323

2424
message(" - Waiting for future to finish")
25-
repeat {
26-
res <- tryCatch(resolved(f), error = identity)
27-
if (!is.logical(res) || res) break
28-
}
29-
print(res)
30-
stopifnot(inherits(res, "error"), inherits(res, "FutureError"),
31-
inherits(res, c("FutureInterruptError", "CallrFutureError")))
25+
f <- resolve(f)
26+
r <- resolved(f)
27+
print(r)
28+
stopifnot(is.logical(r), isTRUE(r))
3229

3330
message(" - Getting results")
3431
res <- tryCatch(result(f), error = identity)

revdep/README.md

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,50 @@
11
# Platform
22

3-
|field |value |
4-
|:--------|:---------------------------------------------------------|
5-
|version |R version 4.3.1 (2023-06-16) |
6-
|os |CentOS Linux 7 (Core) |
7-
|system |x86_64, linux-gnu |
8-
|ui |X11 |
9-
|language |en |
10-
|collate |en_US.UTF-8 |
11-
|ctype |en_US.UTF-8 |
12-
|tz |America/Los_Angeles |
13-
|date |2023-08-08 |
14-
|pandoc |3.1.6 @ /software/c4/cbi/software/pandoc-3.1.6/bin/pandoc |
3+
|field |value |
4+
|:--------|:------------------------------------------------------------------|
5+
|version |R version 4.5.1 (2025-06-13) |
6+
|os |Ubuntu 22.04.5 LTS |
7+
|system |x86_64, linux-gnu |
8+
|ui |X11 |
9+
|language |en |
10+
|collate |en_US.UTF-8 |
11+
|ctype |en_US.UTF-8 |
12+
|tz |Europe/Oslo |
13+
|date |2025-07-10 |
14+
|pandoc |3.4 @ /home/henrik/shared/software/CBI/pandoc-3.4/bin/pandoc |
15+
|quarto |1.7.32 @ /home/henrik/shared/software/CBI/quarto-1.7.32/bin/quarto |
1516

1617
# Dependencies
1718

18-
|package |old |new |Δ |
19-
|:------------|:------|:----------|:--|
20-
|future.callr |0.8.1 |0.8.1-9004 |* |
21-
|callr |3.7.3 |3.7.3 | |
22-
|codetools |0.2-19 |0.2-19 | |
23-
|digest |0.6.33 |0.6.33 | |
24-
|future |1.33.0 |1.33.0 | |
25-
|globals |0.16.2 |0.16.2 | |
26-
|listenv |0.9.0 |0.9.0 | |
27-
|parallelly |1.36.0 |1.36.0 | |
28-
|processx |3.8.2 |3.8.2 | |
29-
|ps |1.7.5 |1.7.5 | |
30-
|R6 |2.5.1 |2.5.1 | |
19+
|package |old |new |Δ |
20+
|:------------|:------|:------|:--|
21+
|future.callr |0.10.0 |0.10.1 |* |
22+
|callr |3.7.6 |3.7.6 | |
23+
|codetools |0.2-20 |0.2-20 | |
24+
|digest |0.6.37 |0.6.37 | |
25+
|future |1.58.0 |1.58.0 | |
26+
|globals |0.18.0 |0.18.0 | |
27+
|listenv |0.9.1 |0.9.1 | |
28+
|parallelly |1.45.0 |1.45.0 | |
29+
|processx |3.8.6 |3.8.6 | |
30+
|ps |1.9.1 |1.9.1 | |
31+
|R6 |2.6.1 |2.6.1 | |
3132

3233
# Revdeps
3334

3435
## All (11)
3536

3637
|package |version |error |warning |note |
3738
|:-----------|:-------|:-----|:-------|:----|
38-
|[dipsaus](problems.md#dipsaus)|0.2.8 | | |1 |
39-
|iml |0.11.1 | | | |
40-
|incubate |1.2.0 | | | |
41-
|mlr3 |0.16.1 | | | |
42-
|mlr3db |0.5.0 | | | |
43-
|mlr3spatial |0.4.1 | | | |
44-
|netShiny |1.0 | | | |
45-
|[projpred](problems.md#projpred)|2.6.0 | | |2 |
46-
|[SpaDES.core](problems.md#spadescore)|2.0.2 | | |2 |
47-
|tarchetypes |0.7.7 | | | |
48-
|targets |1.2.0 | | | |
39+
|[dipsaus](problems.md#dipsaus)|0.3.1 | | |1 |
40+
|futureverse |0.1.0 | | | |
41+
|[iml](problems.md#iml)|0.11.4 |2 | | |
42+
|incubate |1.3.0 | | | |
43+
|mlr3 |1.0.1 | | | |
44+
|mlr3db |0.5.2 | | | |
45+
|mlr3spatial |0.5.0 | | | |
46+
|[netShiny](problems.md#netshiny)|1.0 |1 | | |
47+
|[projpred](problems.md#projpred)|2.9.0 |1 | | |
48+
|SpaDES.core |2.1.0 | | | |
49+
|targets |1.11.3 | | | |
4950

revdep/cran.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## revdepcheck results
22

3-
We checked 11 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package.
3+
We checked 11 reverse dependencies (0 from CRAN + 11 from Bioconductor), comparing R CMD check results across CRAN and dev versions of this package.
44

55
* We saw 0 new problems
66
* We failed to check 0 packages

0 commit comments

Comments
 (0)