Re: [Rd] formal argument "envir" matched by multiple actual arguments

From: <hpages_at_fhcrc.org>
Date: Tue, 02 Jun 2009 01:05:40 -0700

In fact reg.finalizer() looks like a dangerous feature.

If the finalizer itself triggers (implicitely or explicitely) garbage collection, then bad things happen. In the following example, garbage collection is triggered explicitely (using R-2.9.0):

    setClass("B", representation(bb="environment"))

    newB <- function()
    {

      ans <- new("B", bb=new.env())
      reg.finalizer(ans_at_bb,
                    function(e)
                    {
                        gc()
                        cat("cleaning", class(ans), "object...\n")
                    }
      )
      return(ans)

    }

> for (i in 1:500) {cat(i, "\n"); b1 <- newB()}
    1
    2
    3
    4
    5
    6
    ...
    13

    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...

    14
    ...
    169
    170
    171
    Error: not a weak reference
    Error: not a weak reference
    [repeat the above line thousands of times]     ...
    Error: not a weak reference
    Error: not a weak reference
    cleaning B object...
    Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'     Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'     [repeat the above line thousands of times]     ...
    Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'     Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'     172
    ...
    246
    247
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...
    cleaning B object...

     *** caught segfault ***

    address 0x41, cause 'memory not mapped'

    Traceback:

  1. gc()
  2. function (e) { gc() cat("cleaning", class(ans), "object...\n")}(<environment>)

    Possible actions:

  1. abort (with core dump, if enabled)
  2. normal R exit
  3. exit R without saving workspace
  4. exit R saving workspace Selection: 2 Save workspace image? [y/n/c]: n Segmentation fault

So apparently, if the finalizer triggers garbage collection, then we can end up with a corrupted session. Then anything can happen, from the strange 'formal argument "envir" matched by multiple actual arguments' error I reported in the previous post, to a segfault. In the worse case, nothing apparently happens but the output produced by the code is wrong.

Maybe garbage collection requests should be ignored during the execution of the finalizer? (and more generally during garbbage collection itself)

Cheers,
H.



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Tue 02 Jun 2009 - 08:12:39 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 02 Jun 2009 - 10:35:08 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive