guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: C calling Scheme and garbage collection


From: Isaac Jurado
Subject: Re: C calling Scheme and garbage collection
Date: Sun, 30 Jun 2019 22:05:42 +0200

On Sat, Jun 29, 2019 at 7:44 PM Greg Troxel <address@hidden> wrote:
Isaac Jurado <address@hidden> writes:

> On Thu, Jun 27, 2019 at 9:52 PM Greg Troxel <address@hidden> wrote:
>
>> I have been down this path before, with guile and with lua.  Basically,
>> if C (or non-scheme) has a pointer to a scheme object, then you need to
>> hold a logical reference for it and protect the scheme object, and when
>> the C pointer is dropped decrease the refcnt.
>>
>> I am unclear on the details of how you have a ref that gc is made aware
>> of.  One way is to have a scheme array of the object and a count, and
>> have the code null out the object when the count goes to zero or
>> something like that.  But the point is that you need to have  a proxy in
>> the scheme world, visible to gc, when a pointer to a scheme object is
>> held outside of the scheme world.
>>
>
> That's more or less what I had in mind, although instead of an array I
> would use a hash table indexed by a fundamental type (e.g. integer) which
> can be converted painlessly between Scheme and C.

Sure - it just needs to be something the gc will find.

My intention was quite the opposite, use something that the GC will NOT find, like 32/64 bit integers.  I assumed that (pointer->procedure) and its inverse would convert from/to uint32, uint64, etc. natively, without creating GC objects.  This way I can safely give a way such a value to the C code, while using it as a key to a Scheme hashmap.
 
Just because something wasn't collected doesn't mean it is safe.  You
don't actually know that the closure wasn't garbage collected, just that
when you used it the bits were still there.  You might try running under
valgrind.  Or modify guile to clear all objects that are garbage
collected, which I'm guessing it doesn't do.

Agreed, just like the old use after free().
 
In my experience, it's definitely not ok to capture a pointer to a
scheme object and store it for later use without protecting the scheme
object from gc by holding a reference.

It's the sort of advice I was seeking to confirm, so thanks :-)

Best regards.

--
Isaac Jurado

"The noblest pleasure is the joy of understanding"
Leonardo da Vinci

reply via email to

[Prev in Thread] Current Thread [Next in Thread]