Shutdown subprocess debugger and associated Proxies/Adapters when closing
the Idle debugger.

M PyShell.py       : Call RemoteDebugger.close_remote_debugger()
M RemoteDebugger.py: Add close_remote_debugger(); further polish code used
                     to start the debugger sections.
M rpc.py           : Add comments on Idlefork methods register(), unregister()
                     comment out unused methods
M run.py           : Add stop_the_debugger(); polish code
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index 35a2678..60a6335 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -55,25 +55,48 @@
     def __init__(self, addr, handlerclass=None):
         if handlerclass is None:
             handlerclass = RPCHandler
-        self.objtable = objecttable 
+# XXX KBK 25Jun02 Not used in Idlefork, see register/unregister note below.
+#        self.objtable = objecttable 
         SocketServer.TCPServer.__init__(self, addr, handlerclass)
 
-    def verify_request(self, request, client_address):
-        host, port = client_address
-        if host != "127.0.0.1":
-            print "Disallowed host:", host
-            return 0
-        else:
-            return 1
+    # XXX KBK 25Jun02 Following method is not used (yet)
+#      def verify_request(self, request, client_address):
+#          host, port = client_address
+#          if host != "127.0.0.1":
+#              print "Disallowed host:", host
+#              return 0
+#          else:
+#              return 1
 
-    def register(self, oid, object):
-        self.objtable[oid] = object
+# XXX KBK 25Jun02 The handlerclass is expected to provide register/unregister
+#                 methods.  In Idle, RPCServer is instantiated with
+#                 handlerclass MyHandler, which in turn inherits the
+#                 register/unregister methods from the mix-in class SocketIO.
+#                 It is true that this is asymmetric with the RPCClient's use
+#                 of register/unregister, but I guess that's how a SocketServer
+#                 is supposed to work.
 
-    def unregister(self, oid):
-        try:
-            del self.objtable[oid]
-        except KeyError:
-            pass
+#                 Exactly how this gets set up is convoluted.  When the
+#                 TCPServer is instantiated, it creates an instance of
+#                 run.MyHandler and calls its handle() method.  handle()
+#                 instantiates a run.Executive, passing it a reference to the
+#                 MyHandler object.  That reference is saved as an attribute of
+#                 the Executive instance.  The Executive methods have access to
+#                 the reference and can pass it on to entities that they
+#                 command (e.g. RemoteDebugger.Debugger.start_debugger()).  The
+#                 latter, in turn, can call MyHandler(SocketIO)
+#                 register/unregister methods via the reference to register and
+#                 unregister themselves.  Whew.
+
+    # The following two methods are not currently used in Idlefork.
+#      def register(self, oid, object):
+#          self.objtable[oid] = object
+
+#      def unregister(self, oid):
+#          try:
+#              del self.objtable[oid]
+#          except KeyError:
+#              pass
 
 
 objecttable = {}
@@ -198,11 +221,6 @@
                         pass
                     else:
                         raise getattr(__import__(mod), name)(*args)
-# XXX KBK 15Jun02  mod is False here, also want to raise remaining exceptions
-#           else:
-#               if mod:
-#                   name = mod + "." + name
-#               raise name, args
             raise name, args
         if how == "ERROR":
             raise RuntimeError, what