src/nexus.c
changeset 103 454aea1e4f11
parent 100 cfb7776bd6f0
child 105 b6b183fbf373
--- a/src/nexus.c	Wed Apr 01 00:27:03 2009 +0300
+++ b/src/nexus.c	Wed Apr 01 00:27:39 2009 +0300
@@ -353,29 +353,61 @@
     return SUCCESS;
 }
 
+void nexus_shutdown (struct nexus *nexus)
+{
+    // destroy the console
+    if (nexus->lua_console)
+        lua_console_destroy(nexus->lua_console);
+    
+    nexus->lua_console = NULL;
+
+    // unload the modules
+    if (nexus->modules)
+       modules_unload(nexus->modules);
+
+    // quit the irc client
+    if (nexus->client)
+       irc_client_quit(nexus->client, "Goodbye, cruel world ;(");
+
+    // remove the signal handlers
+    if (nexus->signals)
+        signals_free(nexus->signals);
+
+    nexus->signals = NULL;
+
+    // now event_base_dispatch should return once everythings' shut down...
+    nexus->shutdown = true;
+}
+
+void nexus_destroy (struct nexus *nexus)
+{
+    // destroy the modules
+    if (nexus->modules)
+        modules_destroy(nexus->modules);
+
+    nexus->modules = NULL;
+
+    // destroy the irc client
+    if (nexus->client)
+        irc_client_destroy(nexus->client);
+
+    nexus->client = NULL;
+
+    // then force-quit the event loop
+    event_base_loopbreak(nexus->ev_base);
+}
+
 static void on_sigint (evutil_socket_t sig, short what, void *arg)
 {
-    struct nexus *ctx = arg;
+    struct nexus *nexus = arg;
 
     (void) sig;
     (void) what;
     
     log_info("Quitting...");
-
-    // destroy the console
-    if (ctx->lua_console)
-        lua_console_destroy(ctx->lua_console);
-
-    // unload the modules
-    modules_unload(ctx->modules);
-
-    // quit the irc client
-    irc_client_quit(ctx->client, "Goodbye, cruel world ;(");
     
-    // remove the signal handlers (ourself)
-    signals_free(ctx->signals);
-
-    // now event_base_dispatch should return once everythings' shut down...
+    // shutdown
+    nexus_shutdown(nexus);
 }
 
 int main (int argc, char **argv) 
@@ -425,9 +457,16 @@
     // run event loop
     log_info("entering event loop");
 
-    if (event_base_dispatch(nexus->ev_base))
-        FATAL("event_base_dispatch");
-    
+    if (event_base_dispatch(nexus->ev_base)) {
+        if (nexus->shutdown) {
+            log_info("clean shutdown completed");
+
+        } else {
+            FATAL("event_base_dispatch returned without shutdown");
+
+        }
+    }
+
     // ok, no cleanup
     return 0;
 }