asyncio, Tulip issue 171: BaseEventLoop.close() now raises an exception if the
event loop is running. You must first stop the event loop and then wait until
it stopped, before closing it.
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index 2f7f197..42d8b0b 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -247,7 +247,11 @@
 
         This clears the queues and shuts down the executor,
         but does not wait for the executor to finish.
+
+        The event loop must not be running.
         """
+        if self._running:
+            raise RuntimeError("cannot close a running event loop")
         if self._closed:
             return
         self._closed = True
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index 757a22e..b76f69e 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -355,12 +355,12 @@
     def close(self):
         if self.is_closed():
             return
+        super().close()
         self._stop_accept_futures()
         self._close_self_pipe()
         self._proactor.close()
         self._proactor = None
         self._selector = None
-        super().close()
 
     def sock_recv(self, sock, n):
         return self._proactor.recv(sock, n)
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index a62a8e5..df64aec 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -57,11 +57,11 @@
     def close(self):
         if self.is_closed():
             return
+        super().close()
         self._close_self_pipe()
         if self._selector is not None:
             self._selector.close()
             self._selector = None
-        super().close()
 
     def _socketpair(self):
         raise NotImplementedError
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index acb327d..ad4c229 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -44,9 +44,9 @@
         return socket.socketpair()
 
     def close(self):
+        super().close()
         for sig in list(self._signal_handlers):
             self.remove_signal_handler(sig)
-        super().close()
 
     def add_signal_handler(self, sig, callback, *args):
         """Add a handler for a signal.  UNIX only.