tech-userlevel archive

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

Re: kqueue udata



On Wed, Aug 15, 2012 at 09:32:13PM +0200, Jean-Yves Migeon wrote:
> On 15.08.2012 16:04, Eric Radman wrote:
> > 
> > I'm using kqueue across a number of platforms now (MacOS, *BSD, Linux
> > via libkqueue), but the kevent struct on NetBSD introduces type warnings
> > by defining udata differently. Example:
> > 
> > // https://raw.github.com/zeromq/libzmq/master/src/kqueue.cpp
> 
> I did not look in details, but does it fail even with <stdint.h>?
> 
> > //  NetBSD defines (struct kevent).udata as intptr_t, everyone else
> > //  as void *.
> > #if defined ZMQ_HAVE_NETBSD
> > #define kevent_udata_t intptr_t
> > #else
> > #define kevent_udata_t void *
> > #endif
> > 
> > Would it be advantageous to follow FreeBSD by defining  'struct
> > event.udata' as 'void *'?
> 
> Portability issues. It depends on the use case, but people tend to abuse
> APIs.
> 
> Using (void *) is safe (and maybe require fewer casts) as long as you
> treat udata as a pointer/address to an opaque type.
> 
> However, kqueue(2) declares it as a "opaque user data ID", so you can
> theoretically store an ID that is not valid for a (void *). An example
> would be using a non-canonical address as an ID under amd64: it is a
> valid ID, but an invalid address (hence, void *) nonetheless.

A very bad example.
Nothing NetBSD runs on has any valid 'ID' that can be cast to 'intptr_t'
but not to 'void *'.

        David

-- 
David Laight: david%l8s.co.uk@localhost


Home | Main Index | Thread Index | Old Index