[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [Libevent-users] Callback user_data



On Fri, Aug 23, 2013 at 6:23 AM, Timir Karia <tkaria@xxxxxxxxx> wrote:
> Hi All,
>
> I'm using libevent 2.1.3-alpha-dev and was wondering how I could pass an
> event to a callback function as part of another structure. In code I would
> like the following:
>
> struct my_struct {
>   struct event* evt;
>   struct foo* f;
>   int x
> };
>
> void event_callback(evutil_socket_t sock, short what, void *user_data) {
>   struct my_struct* data = (struct my_struct*)user_data;
>   another_function(what, data->evt);
> }
>
> Trouble is when I create and add the event the only option to pass the event
> itself is using event_self_cbarg() as follows:
>
> struct event* new_event;
> new_event = event_new(base, fd, EV_WRITE, event_callback,
> event_self_cbarg());
>
> My question is would it be safe to create my_struct and pass it to event_new
> and then fill in the evt member of my_struct later on by using
> my_struct->evt = event_self_cbarg()?

No, but it's fine to do this:

  struct my_struct *arg;
  struct event* new_event;
  arg = malloc(sizeof struct my_struct);
  new_event = event_new(base, fd, EV_WRITE, event_callback, arg);
  arg->evt = new_event;

The event_self_cbarg() trick is only for the case where you need to
make an event be its own user_data.

peace,
-- 
Nick
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.