Have an event loop thread.
authorPierre Habouzit <madcoder@debian.org>
Fri, 11 Jan 2008 23:55:43 +0000 (00:55 +0100)
committerPierre Habouzit <madcoder@debian.org>
Fri, 11 Jan 2008 23:55:43 +0000 (00:55 +0100)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
lib-sys/evtloop.c
lib-sys/evtloop.h
main.c

index 11546b2..4b2f0d8 100644 (file)
@@ -306,3 +306,19 @@ int el_dispatch(int timeout)
 
     return 0;
 }
+
+void el_initialize(void)
+{
+    gnutls_global_init();
+    epollfd = epoll_create(1024);
+    if (epollfd < 0) {
+        mutt_error("epoll_create");
+        mutt_exit(EXIT_FAILURE);
+    }
+}
+
+void el_shutdown(void)
+{
+    close(epollfd);
+    gnutls_global_deinit();
+}
index 8b465f5..c96f0c2 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <lib-lib/lib-lib.h>
 #include <gnutls/gnutls.h>
+#include <sys/socket.h>
 
 typedef enum el_state {
     EL_LLP_INIT,
@@ -98,5 +99,7 @@ static inline job_t *el_job_start(const machine_t *m, void *cfg) {
 }
 
 int el_dispatch(int timeout);
+void el_initialize(void);
+void el_shutdown(void);
 
 #endif
diff --git a/main.c b/main.c
index 2d52aa9..74f95be 100644 (file)
--- a/main.c
+++ b/main.c
 #include <lib-lib/lib-lib.h>
 
 #include <sys/utsname.h>
+#include <pthread.h>
 
 #include <lib-lua/lib-lua.h>
 #include <lib-sys/mutt_signal.h>
+#include <lib-sys/evtloop.h>
 #include <lib-mime/mime.h>
 #include <lib-ui/lib-ui.h>
 #include <lib-mx/mx.h>
@@ -174,6 +176,14 @@ static void mutt_nocurses_error (const char *fmt, ...)
     fputc('\n', stderr);
 }
 
+static void *evtloop(void *data)
+{
+    for (;;) {
+        el_dispatch(100);
+        pthread_testcancel();
+    }
+}
+
 int main (int argc, char **argv)
 {
   char folder[_POSIX_PATH_MAX] = "";
@@ -188,6 +198,7 @@ int main (int argc, char **argv)
   int version = 0;
   int i;
   int explicit_folder = 0;
+  pthread_t pt;
 
   /* initialize random number for tmp file creation */ 
   srand48((unsigned int) time (NULL));
@@ -303,8 +314,10 @@ int main (int argc, char **argv)
   }
 
   /* set defaults and read init files */
+  el_initialize();
   mutt_init (flags & M_NOSYSRC, commands);
   string_list_wipe(&commands);
+  pthread_create(&pt, NULL, &evtloop, NULL);
 
   if (!option(OPTNOCURSES)) {
       ui_layout_init();
@@ -490,6 +503,7 @@ int main (int argc, char **argv)
                                    NULL)) || !explicit_folder)
     {
       mutt_index_menu ();
+
       if (option (OPTXTERMSETTITLES))
         printf("\033]2;%s\007", NONULL(XtermLeave));
       if (Context)
@@ -498,7 +512,10 @@ int main (int argc, char **argv)
     mutt_endwin (Errorbuf);
   }
 
+  pthread_cancel(pt);
+  pthread_join(pt, NULL);
   luaM_shutdown();
   mutt_sasl_shutdown();
+  el_shutdown();
   exit (0);
 }