Skip to content

reg.finalizer and connection gc -- which runs when (and why)?

2 messages · Martin Morgan, Luke Tierney

#
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
#
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: