From jtk at cmp.uea.ac.uk  Wed Apr 13 12:44:02 2005
From: jtk at cmp.uea.ac.uk (Jan T. Kim)
Date: Wed Apr 13 11:48:40 2005
Subject: [Rd] How allocate STRSXP outside of gc
In-Reply-To: <C698D707214E6F4AB39AB7096C3DE5A59E8922@phost015.EVAFUNDS.intermedia.net>
References: <C698D707214E6F4AB39AB7096C3DE5A59E8922@phost015.EVAFUNDS.intermedia.net>
Message-ID: <20050413104402.GG31498@jtkpc.cmp.uea.ac.uk>

On Tue, Apr 12, 2005 at 12:31:03PM -0700, Vadim Ogranovich wrote:
> Hi,
>  
> I am trying to figure a way to allocate a string SEXP so that gc() won't
> ever collect it.
>  
> Here is a little bit of a background. Suppose I want to write a
> .Call-callable function that upon each call returns the same value, say
> mkChar("foo"):
>  
> SEXP getFoo() {
>    return mkChar("foo");
> }
>  
> The above implementation doesn't take advantage of the fact that
> mkChar("foo") could be pre-computed only once, and then the function
> would return the pre-computed value. So the question is how to create
> this precomputed value.
>  
>  
> The closest thing I could find in the sources is R_NaString, but I was
> not able to trace down how it comes about.

For being unaffected by R's memory management, it may be the best to
not use a SEXP for storing the pre-computed result at all. Rather, use
a static variable "private" to your code, as in

    SEXP getFoo()
    {
      static char *foo = NULL;

      if (foo == NULL)
      {
        foo = the_difficult_to_compute_value_of_foo();
      }
      return mkChar(foo);
    }

This way, getFoo indeed invokes mkChar each time, but in your scenario,
that might be an overhead which is negligible compared to the actual
computation of the foo value.

Best regards, Jan
-- 
 +- Jan T. Kim -------------------------------------------------------+
 |    *NEW*    email: jtk@cmp.uea.ac.uk                               |
 |    *NEW*    WWW:   http://www.cmp.uea.ac.uk/people/jtk             |
 *-----=<  hierarchical systems are for files, not for humans  >=-----*


[Rd] How allocate STRSXP outside of gc
Jan T. Kim