Hi,
I am forking an FFI library for physics simulation on Github (https://github.com/samvv/Rhipmunk-Physics) but I got stuck with storing racket objects in the library’s native structs. From the library’s website: http://chipmunk-physics.net/release/Chipmunk-6.x/Chipmunk-6.1.2-API-Reference/group__cp_body.html. Here’s the part of the code that needs to be changed:
(define _cpDataPointer _racket)
(define-cstruct _cpBody
…
[data _cpDataPointer] ; user-defined data, like a game object
…)
In the following test everything seems to work as expected:
(define body1 (cpBodyNew 1.0 1.0))
(set-cpBody-data! body1 "This is a test")
(display (cpBody-data body1))
> “This is a test”
(set-cpBody-data! body1 (cons 1 2))
(display (cpBody-data body1))
> (1 . 2)
However, when I run the following code:
(collect-garbage)
(display (cpBody-data body1))
Something goes wrong internally. Sometimes DrRacket crashes, sometimes it returns values like #<bad-value>. I have looked into (malloc-immobile-cell v) and (free-immobile-cell cptr) but I am not sure that fiddling with the memory is such a good idea. Could you please give me any guidelines or point me to a procedure I can use to provide this functionality?
Thanks,
Sam
https://github.com/jeapostrophe/chipmunk/blob/master/chipmunk-ffi.ss
I used _pointer rather than _racket for my body data.
My understanding is that in your version, the Racket object is only
available via the Chipmunk/C data structure, which the GC views as
opaque, so it is collected. If you want to put Racket things in C
objects, you'll have to make sure they are retained on the Racket
side, by (for example), also storing them in a hash table and
monitoring access to the C objects.
Jay
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
--
Jay McCarthy <j...@cs.byu.edu>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay
"The glory of God is Intelligence" - D&C 93
____________________
Racket Users list:
http://lists.racket-lang.org/users
I know, I actually used your code and a fork of it on github as a starting point (https://github.com/Freezerburn/Rhipmunk-Physics). It really helped a lot! I have added your name to the authors list. If you have an issue with that I can remove it of course.
I'm going to use Matthew's solution just to make sure no pointers get messed up.
Sam
-----Oorspronkelijk bericht-----
Van: Jay McCarthy [mailto:jay.mc...@gmail.com]
Verzonden: maandag 4 maart 2013 14:35
Aan: Sam Vervaeck
CC: users
Onderwerp: Re: [racket] FFI Pointing to racket objects