Libev, How to pass arguments to relevant callbacks

前端 未结 2 1936
忘掉有多难
忘掉有多难 2021-02-18 13:31

I\'m trapped in a situation of argument passing in libev.

Usually, libev receives packages in a function like *receive_callback*, that\'s OK, but in pra

相关标签:
2条回答
  • 2021-02-18 14:28

    The author answered it himself, but in a comment. Since this shows up as unanswered, I am posting his answer in the "answer" section and closing the loop. Not sure if there is a better way... feel free to fix this.

    Question author says:

    Sorry, I think I got the answer now, and feel deeply ashamed at my carelessness of reading documentation:

    struct my_io{
       ev_io io;
       int otherfd;
       void *somedata;
       struct whatever *mostinteresting;
    };
    // ...
    struct my_io w;
    ev_io_init (&w.io, my_cb, fd, EV_READ);
    

    And then we use the my_io like this:

    static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
    {
       struct my_io *w = (struct my_io *)w_;
       //...
    }
    
    0 讨论(0)
  • 2021-02-18 14:32

    Yes it's explained in libev document, and there is another way. Each watcher has a void *data member that you can read or modify, and libev will completely ignore it, so you can pass the argument like this:

    w->data = (void *)recv_buff;
    ...
    static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
    {
        S_RECV_MSG *recv_buff = (S_RECV_MSG*)w_->data;
        ...
    }
    

    see libev document.

    0 讨论(0)
提交回复
热议问题