From 9d865c8fee774ce24e331230b910bf1aada64eb9 2012-04-15 00:48:40
From: Fernando Perez <fperez.net@gmail.com>
Date: 2012-04-15 00:48:40
Subject: [PATCH] Merge pull request #1597 from minrk/while_eventloop

re-enter kernel.eventloop after catching SIGINT

This protects the kernel from exiting due to bugs failing to catch SIGINT properly in the eventloop integration functions, as described in #1228. It does not fix those bugs, only reduces the severity of their consequences.
---

diff --git a/IPython/zmq/ipkernel.py b/IPython/zmq/ipkernel.py
index 1c8a258..33b70cb 100755
--- a/IPython/zmq/ipkernel.py
+++ b/IPython/zmq/ipkernel.py
@@ -201,12 +201,17 @@ class Kernel(Configurable):
         # stop ignoring sigint, now that we are out of our own loop,
         # we don't want to prevent future code from handling it
         signal(SIGINT, default_int_handler)
-        if self.eventloop is not None:
+        while self.eventloop is not None:
             try:
                 self.eventloop(self)
             except KeyboardInterrupt:
                 # Ctrl-C shouldn't crash the kernel
                 io.raw_print("KeyboardInterrupt caught in kernel")
+                continue
+            else:
+                # eventloop exited cleanly, this means we should stop (right?)
+                self.eventloop = None
+                break
 
 
     def record_ports(self, ports):