Hello Chicken users,
I'm struggling with an issue where a scheme object is being unexpectedly
garbage collected.
To provide some context: my program's main() is in C, and the C code calls out
to scheme procedures. One of these scheme procedures makes and returns a
struct (via the defstruct extension). I attempt to store the resulting struct
in a gc root, but the struct gets garbage collected anyway, at some
indeterminate time in the future. Here is what my code (basically) looks like:
;;;; mystruct.scm
(require-extension defstruct)
(defstruct mystruct foo)
(define-external (new_mystruct ()) scheme-object
(make-mystruct))
/* mystruct.c */
void *
build_mystruct(void)
{
C_word mystruct;
void *root;
root = CHICKEN_new_gc_root();
mystruct = new_mystruct();
CHICKEN_gc_root_set(root, mystruct);
return root;
}
The way I understood it, the returned "mystruct" instance would never get
garbage collected until I explicitly call CHICKEN_delete_gc_root(). I never
actually delete the root (I set a breakpoint on CHICKEN_delete_gc_root in gdb,
just to be sure), but the object gets garbage collected anyway. The next time
I try to pass the instance of mystruct to a scheme procedure, the procedure
fails because the argument is not of the expected type (when I print the
argument, I see " #<invalid forwarded object>").
I must be confused about how gc roots work. Am I doing anything that is
obviously wrong? I can try to post some real code if that would help.
All responses appreciated.
Thanks,
Chris
_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users