[Rd] reg.finalizer and connection gc -- which runs when (and why)?
luke-tierney at uiowa.edu
luke-tierney at uiowa.edu
Fri Jul 22 15:05:15 CEST 2011
Connections use finalizers for cleanup. Once finalizers become
eligible to run, the order in which they are run is unspecified. If
you want to be sure yours runs first then you need to make sure the
connection one doesn't become eligible to run until yours has.
Best,
luke
On Thu, 21 Jul 2011, Martin Morgan wrote:
> With this set-up
>
> options(warn = 1)
> tf <- tempfile()
> finalizer <- function(obj) {
> message("finalizer")
> close(obj$f)
> }
>
> this code works
>
> ev <- new.env()
> ev$f <- file(tf, "w")
> reg.finalizer(ev, finalizer)
> rm(ev)
> gc()
>
> whereas this (reversing the order of file() and reg.finalizer())
>
> ev <- new.env()
> reg.finalizer(ev, finalizer)
> ev$f <- file(tf, "w")
> rm(ev)
>
> produces
>
>> gc()
> Warning: closing unused connection 3 (/tmp/Rtmp9CWLtN/file6998ee7b)
> finalizer
> Error in close.connection(obj$f) : invalid connection
>
> In some respects, it seems like the user should get a chance to clean up
> their mess before the system does it for them, so the above seems like a bug.
> But maybe there is another way to understand this?
>
> Martin
>
--
Luke Tierney
Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa Phone: 319-335-3386
Department of Statistics and Fax: 319-335-3017
Actuarial Science
241 Schaeffer Hall email: luke at stat.uiowa.edu
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
More information about the R-devel
mailing list