2011-12-16 15 views
6

Estoy trabajando con libfuse y con la interfaz de eventos glib y me he encontrado con un problema en el que necesito ejecutar varios bucles principales al mismo tiempo (glib's g_main_loop_run y fuse_loop_mt).Posible ejecutar múltiples bucles principales?

ya he intentado creado un hilo independiente para bucle de eventos de mucha labia bajo un contexto secundario, por ejemplo .:

static void * 
event_loop(void *arg) 
{ 
    GMainLoop *event_loop; 
    GMainContext *context;  

    context = g_main_context_new(); 
    g_main_context_push_thread_default(context); 
    event_loop = g_main_loop_new(context, FALSE); 
    g_main_loop_run(event_loop); 

    return NULL; 
} 

... 

pthread_t event_thread; 
pthread_attr_t thread_attr; 
pthread_attr_init(&thread_attr); 
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); 
event_thread = pthread_create(&event_thread, &thread_attr, 
    event_loop, NULL); 

Sin embargo, el bucle de eventos simplista no recoge en cualquiera de los eventos activados. ¿Estoy totalmente fuera de base aquí? ¿Cuál es la forma correcta de abordar múltiples bucles principales?

+0

La mejor manera, supongo que sería evitar múltiples bucles principales si es posible. Integre alternativamente los bucles de eventos para que pueda usar solo uno para recibir y procesar eventos. –

+0

Desafortunadamente, eso no es posible. Necesito la interfaz glib (libevent, etc.) para utilizar la interfaz híper curl. Fusible, por razones obvias también necesita un ciclo principal. –

Respuesta

4

El lazo principal GLib admite custom event sources. No sé mucho sobre FUSE, pero es posible que pueda ejecutar el bucle principal de FUSE dentro de otro hilo e integrar sus eventos en el bucle GLib.

Una búsqueda rápida sugiere que pueda utilizar una API de FUSE de nivel inferior para escribir your own main loop, que se podría integrar más fácilmente en GLib simplemente omitiendo la parte de "bucle".

En general, sin embargo, varios bucles principales son solo malas noticias; es por eso que se llaman principales loops. :) La mejor manera de manejarlos es eliminarlos enganchando eventos directamente en cualquier bucle que funcione mejor para ti. Lamentablemente, no todas las API proporcionan los ganchos suficientes para que eso sea posible.

+0

+1 Esta es probablemente la mejor manera sensata de hacerlo, pero me gustaría añadir que si usas linux 'eventfd' o' pipe' probablemente sean buenas formas de enviar mensajes al lazo principal de Glib, ya que Devuelve descriptores de archivos que se pueden usar casi directamente con glib. – Lalaland

+0

Buen punto; incluso podría ser preferible 'fork()' y ejecutar el bucle principal FUSE (o GLib) desde allí, sin preocuparse por ningún problema con multi-threading. – ehird

+0

Gracias, Ethan. Tenía miedo de tener que moverme a la interfaz de bajo nivel. Parece que va a ser un largo día :) –

3

Además de configurar bucles principales en un hilo separado o un proceso (de la poca experiencia que he tenido, el proceso por separado ha funcionado mejor para mí, pero de nuevo el hilo podría funcionar bien en su caso), puede considerar integrando el bucle principal del fusible en el bucle principal de GLib (Desafortunadamente no tengo experiencia previa con esto). Puede marcar this thread discussion sobre el mismo (en caso de que no lo haya visto ya). Como se sugiere al final del hilo " Register the fuse device file descriptor (fuse_chan_fd()) with the glib event loop. Then call fuse_chan_recv() and fuse_session_process() when the event trigger". Para rastrear el fd, necesitará usar GIO (More info on Nokia developer page).
¡Espero que esto pueda proporcionar algunos consejos!

+0

Gracias, esto también es útil. –

Cuestiones relacionadas