chicken-users
[Top][All Lists]
Advanced

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

[Chicken-users] object-evict isn't working as expected.


From: Tony Sidaway
Subject: [Chicken-users] object-evict isn't working as expected.
Date: Mon, 5 Feb 2007 19:30:47 +0000

What's up here?

I have a Scheme string that I want to send to a C library.  The
library will remember its location and so I want it to be in static
memory, so I use object_evict and send the result of object-evict to
the library as a c-string argument to a foreign-lambda. The library
now knows the address of the data in the evicted string.

At some point I call another library function as a
foreign-safe-lambda.  During the course of executing that function it
executes a callback whose address I've sent it as a c-pointer argument
to another foreign-lambda.

The callback seems to execute okay.  It makes a new u8vector and
copies some data into it, then has a let loop to convert u8s to char
(integer->char) and display, character-by-character

However the evicted string seems to be trashed.  It now contains garbage.

I wondered if I could duplicate this so I wrote a simple dummy copy of
the library functions. The dummy version of the first C function
stores the c-string  in a static pointer to char.  The dummy version
of the second C function executes the callback and then writes out the
value of the string.  The string in the dummy copy is corrupted just
as it was in the real library.  Further tests show that the corruption
appears after the callback is invoked.

Making all foreign-lambdas into foreign-safe-lambdas doesn't make any
difference.

However the evicted variable seems to be quite okay on the Scheme side.

This is what is really puzzling.  It seems that the evicted object has
moved around after being evicted, and Scheme keeps track of it.  But
of course C doesn't know this and gets corrupted data.  That doesn't
make sense.  If we can say one thing about the output of object-evict,
surely it's that it won't move around?




reply via email to

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