2011-12-16 14 views
6

Sto lavorando con libfuse e l'interfaccia di glib glib e ho incontrato un problema in cui ho bisogno di eseguire più loop principali contemporaneamente (glib g_main_loop_run e fuse_loop_mt).È possibile eseguire più loop principali?

ho già cercato di creare un thread indipendente per il ciclo di eventi di glib in un contesto secondario, ad es .:

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

Tuttavia il ciclo degli eventi glib non raccoglie su uno qualsiasi degli eventi sparati. Sono totalmente fuori base qui? Qual è il modo corretto per affrontare più loop principali?

+0

Il modo migliore, suppongo, sarebbe di evitare più loop principali, se possibile. In alternativa, integra i loop di eventi in modo da poterne utilizzare solo uno per ricevere ed elaborare eventi. –

+0

Purtroppo, questo non è possibile. Ho bisogno dell'interfaccia glib (libevent, ecc.) Per utilizzare l'interfaccia hiper di curl. Fusibile, per ovvi motivi serve anche un ciclo principale. –

risposta

4

Il ciclo principale GLib supporta custom event sources. Non so molto su FUSE, ma potresti essere in grado di eseguire il ciclo principale di FUSE all'interno di un altro thread e integrare i suoi eventi nel ciclo di GLib.

Una rapida ricerca suggerisce che potresti essere in grado di utilizzare un'API FUSE di livello inferiore per scrivere your own main loop, che potrebbe presumibilmente essere integrato più facilmente in GLib semplicemente saltando la parte "loop".

In generale, tuttavia, più loop principali sono solo cattive notizie; è per questo che si chiamano main loop. :) Il modo migliore per gestirli è eliminarli collegando gli eventi direttamente a qualunque loop funzioni meglio per te. Sfortunatamente, non tutte le API forniscono gli hook sufficienti per renderlo possibile.

+0

+1 Questo è probabilmente il miglior modo ragionevole per farlo, ma vorrei aggiungere alcuni che se stai usando linux 'eventfd' o' pipe' sarebbe probabilmente un buon modo per inviare messaggi al ciclo principale di Glib, poiché restituisce descrittori di file che possono essere utilizzati quasi direttamente con glib. – Lalaland

+0

Buon punto; potrebbe anche essere preferibile a 'fork()' ed eseguire il ciclo principale FUSE (o GLib) da lì, senza preoccuparsi di problemi con il multi-threading. – ehird

+0

Grazie, Ethan. Avevo paura di dover passare all'interfaccia di basso livello. Sembra che sarà una lunga giornata :) –

3

Oltre all'impostazione di loop principali in un thread o processo separato (dal piccolo po 'di esperienza che ho avuto, il processo separato ha funzionato meglio per me ma poi di nuovo thread potrebbe funzionare bene nel tuo caso), puoi considerare integrare il loop principale dei fusibili nel loop principale di GLib (purtroppo non ho alcuna esperienza precedente con questo). Puoi controllare lo stesso this thread discussion (nel caso non lo avessi già visto). Come suggerito alla fine del thread " 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". Per tenere traccia di fd è necessario utilizzare GIO (More info on Nokia developer page).
Speriamo che questo possa fornire alcuni suggerimenti!

+0

Grazie, anche questo è utile. –