[gambit-list] Proper usage of ffi structs
Mikael
mikael.rcv at gmail.com
Thu Aug 22 09:20:51 EDT 2013
Aha.
Very well, then I guess it's good time to ask Marc how this stuff works
really. :))
Marc, would you feel like enlightening us on this one - how use and reclaim
of non-pointered FFI structs works out?
Thanks,
Mikael
2013/8/22 Chris Mueller <ruunsmail at gmail.com>
> Good point.
>
> But gsc / gcc are reclaiming ___result_voidstar is of type
> void* and has no elements x and y therefore.
>
> Manually casting to struct point* is of course possible, but will result
> in an expected segmentation fault during the execution of the script.
>
>
> On 22.08.2013 08:34, Mikael wrote:
> > What about you presume that ___result_voidstar is already allocated, and
> > you just access/mutate it? I.e.
> >
> >
> > (define make-point
> > (c-lambda (int int) struct-point
> > "___result_voidstar->.x = ___arg1;
> > ___result_voidstar->y = ___arg2;"))
> >
> > ?
> >
> >
> >
> > 2013/8/22 Chris Mueller <ruunsmail at gmail.com <mailto:ruunsmail at gmail.com
> >>
> >
> > I'm opening a new subject for the ffi struct issue to sum up the
> current
> > discussion:
> >
> > In 19.1 "The Mapping of types between C and Scheme" of the gambit
> > documentation is mentioned:
> >
> > "In the case of the struct, union and type types, the default
> function
> > reclaims the copy on the C heap referenced by the internal pointer
> (when
> > using a C++ compiler this is done using ‘delete
> > (type*)internal-pointer’, which calls the destructor of type if it
> is a
> > class) and returns ‘___FIX(___NO_ERR)’. In many situations the
> default
> > release-function will perform the appropriate cleanup for the foreign
> > type."
> >
> > If i interpret this correctly, a declared struct type in a ffi
> provides
> > a default release function that automatically calls a destructor
> (used
> > with g++) and frees the corresponding memory.
> >
> > Unfortanetly, i'm little lost to use it correctly and experiment
> > currently heavily to find the right way.
> >
> >
> > Assume a type:
> >
> > (c-declare "struct point { int x; int y; };")
> > (c-define-type struct-point (struct "point"))
> >
> >
> > Assume a test programm that allocates a point 1_000_000_000 times.
> >
> > (define (alloc-point times)
> > (let loop ((i 0))
> > (if (< i times)
> > (let ((a (make-point 0 0)))
> > (loop (+ i 1)))))))
> >
> > (alloc-point 1000000000)
> >
> >
> > How do we implement (make-point x y) to use a ffi struct type with a
> > default release function in Gambit?
> >
> > 1) With a manually allocated pointer it will leak memory.
> >
> > (define make-point
> > (c-lambda (int int) struct-point
> > "point* a = new Point;
> > a->x = ___arg1;
> > a->y = ___arg2;
> > ___result_voidstar = a;"))
> >
> > 2) With a stack-allocated value it will segfault immediately.
> >
> > (define make-point
> > (c-lambda (int int) struct-point
> > "point a;
> > a.x = ___arg1;
> > a.y = ___arg2;
> > ___result = a;"))
> >
> > 3) If we give the address of a stack-allocated value to
> > ___result_voidstar the allocation loop is running with constant
> memory
> > space but the programm will segfault after quiting with CTRL + X.
> >
> > (define make-point
> > (c-lambda (int int) struct-point
> > "point a;
> > a.x = ___arg1;
> > a.y = ___arg2;
> > ___result_voidstar = &a;"))
> >
> >
> > For more details, see discussion:
> >
> https://mercure.iro.umontreal.ca/pipermail/gambit-list/2013-August/006950.html
> >
> >
> > Chris
> > _______________________________________________
> > Gambit-list mailing list
> > Gambit-list at iro.umontreal.ca <mailto:Gambit-list at iro.umontreal.ca>
> > https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
> >
> >
>
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20130822/6ad42943/attachment.htm>
More information about the Gambit-list
mailing list