[gambit-list] How to pass a Scheme string to a const char*?

Vok Vojwo ceving at gmail.com
Wed Dec 14 05:10:38 EST 2011


2011/12/12 Marc Feeley <feeley at iro.umontreal.ca>:
> I finally understand the problem you were explaining.  It is that openlog stores a pointer to the "ident" string that will be used in subsequent calls to syslog.  It does not take a copy of the string.  This means the C string which was converted from Scheme for the first argument of openlog must remain live after the call to openlog returns.

Exactly.

> This can be accomplished by incrementing the reference count on the C string when openlog is called, and decrementing the reference count on the closelog call.

Thank you for explaining this.

> (c-declare "static char *temp = NULL;")
>
> (define openlog
>  (c-lambda
>   (char-string int int)
>   void
>   "if (temp != NULL) ___EXT(___release_string)(temp);
>    temp = ___arg1;
>    ___EXT(___addref_string)(___arg1);
>    openlog(___arg1,___arg2,___arg3);"))
>
> (define closelog
>  (c-lambda
>   ()
>   void
>   "if (temp != NULL) ___EXT(___release_string)(temp);
>    closelog();"))

But how about the GC moving the string around? As far as I understood
it is possible that the string in arg1 moves somewhere else. After
that temp would not point to the string any more.



More information about the Gambit-list mailing list