Re: GC safety and return values Jim Blandy 24 Dec 2003 16:43 UTC

My initial post, as written, does say that explicitly freed references
solve the thread-related problems with SCHEME_EXTRACT_VALUE_POINTER
and SCHEME_EXTRACT_STRING.  But that's not right; as described,
references don't have anything to do with that problem.

I inserted the paragraph about SCHEME_EXTRACT_* after I'd written
everything else, and didn't notice that I'd changed the antecedent of
"this problem" in the next paragraph.

Here is how that section should read:

  The proposal states that "the garbage collector may run whenever an
  object is allocated in the heap."  In context, I think that really
  means, "the garbage collector may *only* run..."  In a multi-threaded
  context, I think this must mean that the collector may only run when
  any thread allocates an object on the heap, which isn't much of a
  restriction at all; the collector can run at any time.

  If that is so, then the way the proposal suggests C code should refer
  to Scheme values makes it impossible for the collector to find and
  relocate heap references.  The C compiler may have stashed them
  anywhere, in disguised forms, and it is probably unwilling to tell you
  much about where they are at any given time.

  The Java Native Interface handles this problem by essentially
  forbidding C code from ever referring directly to a GC'd object.
  Instead, C code may only handle "references" to GC'd objects.  This
  restriction is enforced by the type system.  References are explicitly
  freed objects, which is way people are accustomed to working in C.
  And because the explicit-free model is a complete pain in the neck,
  the JNI tries to ease that pain by segregating references into "local"
  and "global", where "local" references are freed for you at a
  convenient time.

  Another issue is that, if a collection could occur at any time, the
  values returned by macros like SCHEME_EXTRACT_VALUE_POINTER and
  EXTRACT_STRING can't be trusted long enough to be useful.  This can
  be solved in various ways; one idea is sketched in:

    http://sources.redhat.com/ml/guile/1999-01/msg00093.html