pasar parametro funcion como c callback libev

parametro - callback javascript



Libev, cómo pasar argumentos a callbacks relevantes (2)

El autor lo contestó él mismo, pero en un comentario. Dado que esto aparece como sin respuesta, estoy publicando su respuesta en la sección "respuesta" y cerrando el ciclo. No estoy seguro de si hay una mejor manera ... siéntase libre de arreglar esto.

El autor de la pregunta dice:

Lo siento, creo que tengo la respuesta ahora y me siento profundamente avergonzado por mi descuido de leer la documentación:

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);

Y luego usamos el my_io así:

static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) { struct my_io *w = (struct my_io *)w_; //... }

Estoy atrapado en una situación de discusión pasando en Libev.

Por lo general, libev recibe paquetes en una función como * receive_callback * , eso está bien, pero en la práctica, necesitamos enviar un * write_callback * relativo para tratar con trabajos específicos de acuerdo con el paquete recibido. Por ejemplo:

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: // ....... }

Mi pregunta es, si el write_callbackX también tiene que leer el contenido específico en recv_buff, ¿cómo podemos pasar el argumento recv_buff al callbackX? ¿Debemos soportar la carga y la fealdad de las variables globales aquí?


Sí, se explica en el documento libev, y hay otra manera. Cada observador tiene un miembro de datos void * que puede leer o modificar, y libev lo ignorará por completo, por lo que puede pasar el argumento de esta manera:

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; ... }

ver documento libev .