[rabbitmq-discuss] rabbitmq-c
Scott Brooks
scott.brooks at epicadvertising.com
Wed Sep 30 16:41:30 BST 2009
On 2009-09-30, at 9:13 AM, Tony Garnock-Jones wrote:
> Hi Scott,
>
> Scott Brooks wrote:
>> Although passing the amqp_bytes_t as a struct is a really great
>> solution to C strings, passing structs by value, and returning
>> structs
>> is not supported by libffi/ruby-ffi(as far as I could test anyways).
>
> Yes, it seems like a slightly edgy thing to do even in a C API, I
> think.
>
>> So I took amqp_api.c, and wrote amqp_api_p.c which accepts pointers
>> to
>> structs rather then copy by value. These functions just create take
>> the pointers, copy to local vars and then calls the existing
>> functions.
>
> That sounds reasonable. I notice that there aren't many functions that
> *return* structs, and those that do are special anyway.
Yeah, amqp_cstring_bytes is the main one that returns a struct.
>
> I wonder whether you're doing this:
>
> amqp_bytes_t v = *arg;
> somefun(v);
>
> or simply:
>
> somefun(*arg);
>
> ?
Actually I'm doing something worse!
amqp_bytes_t body;
memcpy(&body, in_body, sizeof(body);
But gcc does a good job on -O1 and above and replaces the memcpy.
>
>> In general I see a few solutions to the problem of wrapping
>> rabbitmq-c
>> for use in higher level languages.
>> A: don't support it
>
> ... thus providing a slight impetus for those languages to make their
> FFI able to cope with structs-by-value :-)
>
> Is the lack of structs-by-value a libffi thing, or is it a problem
> with
> the ruby interface to libffi?
Looking at the unit tests for libffi, it looks like they pass by
struct properly.
I wrote a patch to handle returning structs for ruby-ffi, and then got
stuck on
handling the pass struct by value because I forgot that the shared
library ABI
would have a well defined interface for that.
>
>> B: keep a parallel set of pass by pointer functions so either API can
>> be used(currently it just copies the data passed to the pointer, and
>> then calls the pass by value functions)
>
> Possible, possible. How are you thinking of dealing with AMQP tables?
> They're a little more complex than amqp_bytes_t - a simple
> pointer-passing strategy might not work so well.
>
>> C: change the whole API to pass pointers.
>
> I don't like this idea.
I guess option D is revisiting ruby-ffi and trying to get the pass
structs by
value code working, which looks to be the route I'll try and take.
>
>
> Regards,
> Tony
> --
> [][][] Tony Garnock-Jones | Mob: +44 (0)7905 974 211
> [][] LShift Ltd | Tel: +44 (0)20 7729 7060
> [] [] http://www.lshift.net/ | Email: tonyg at lshift.net
More information about the rabbitmq-discuss
mailing list