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 practice, we need to dispatch a relative *write_callback* to deal with specific jobs according to the received package. For example:
S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff;
switch(pstRecvMsg->wMsgType) {
case 1:
ev_io_init(w, write_callback1, w->fd, EV_WRITE);
break;
case 2:
ev_io_init(w, write_callback2, w->fd, EV_WRITE);
break;
case 3:
// .......
}
My question is, if the write_callbackX
also has to read the specific content in the recv_buff, how can we pass the recv_buff argument to the callbackX? Must we bear the burden and ugliness of global variables here?
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:
see libev document.
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: