Actualmente estoy escribiendo una aplicación multiproceso utilizando libevent.Evento desencadenado por el usuario en libevent
Algunos eventos son desencadenados por IO, pero necesito un par de eventos que se desencadenan a través de los hilos por el código en sí, utilizando event_active().
He tratado de escribir un programa simple que muestra dónde está mi problema:
El evento se crea utilizando event_new(), y el conjunto fd a -1.
Al llamar a event_add(), si se utiliza una estructura de tiempo de espera, Event event maneja adecuadamente el evento event_base_dispatch.
Si event_add (ev, NULL) se utiliza en lugar, devuelve 0 (al parecer con éxito), pero event_base_dispatch() devuelve 1 (lo que no significa que el evento no fue registrado correctamente.)
Este comportamiento se puede probar usando el siguiente código y el intercambio de las líneas event_add:
#include <event2/event.h>
#include <unistd.h>
void cb_func (evutil_socket_t fd, short flags, void * _param) {
puts("Callback function called!");
}
void run_base_with_ticks(struct event_base *base)
{
struct timeval one_sec;
one_sec.tv_sec = 1;
one_sec.tv_usec = 0;
struct event * ev1;
ev1 = event_new(base, -1, EV_PERSIST, cb_func, NULL);
//int result = event_add(ev1, NULL);
int result = event_add(ev1, &one_sec);
printf("event_add result: %d\n",result);
while (1) {
result = event_base_dispatch(base);
if (result == 1) {
printf("Failed: event considered as not pending dispite successful event_add\n");
sleep(1);
} else {
puts("Tick");
}
}
}
int main() {
struct event_base *base = event_base_new();
run_base_with_ticks(base);
return 0;
}
de compilación: g ++ sample.cc -levent
lo que pasa es que no necesito el tiempo de espera, y no quiero usar un n-años tiempo de espera como solución alternativa. Entonces, si esta no es la forma correcta de usar eventos desencadenados por el usuario, me gustaría saber cómo se hace.
Gracias Nick por su rápida respuesta. – Quentin
Tengo algunos comentarios al respecto: - En cuanto a mi proyecto actual, creo que puedo evitar esto utilizando el ciclo de eventos de forma ligeramente diferente y utilizando el tiempo de espera para activar (innecesariamente) el procesamiento después de una espera relativamente larga (1 segundo es una eternidad en el mundo de los servidores). - ¿Por qué no solo hace posible usar eventos puros desencadenados por el usuario además de fd o timeout? - Si se va a ignorar el evento, ¿no debería event_add devolver algo más que 0? Estaba tentado por el truco event_base_add_virtual, pero prefiero que mi código sea compatible con versiones posteriores. – Quentin
Es posible usar eventos puros desencadenados por el usuario: los haces con event_new (base, -1/* no fd * /, 0/* sin eventos * /, devolución de llamada, callback_data). Los activas con event_active(). Sin embargo, no se les agrega event_add(): event_add() es solo para eventos que una base debe sondear por sí mismo. – nickm