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