code: def switch(self):
          
          if self._loop is None or not self.is_alive():
              raise RuntimeError('hub is closed/dead')
          elif fibers.current() is self:
              raise RuntimeError('cannot switch to myself')
          elif compat.get_thread_ident() != self._thread:
              raise RuntimeError('cannot switch from a different thread')
          value = super(Hub, self).switch()
          # A fiber exit will cause its parent to be switched to. All fibers in
          # the system should be children of the Hub, *except* the Hub itself
          # which is a child of the root fiber. So do an explicit check here to
          # see if the Hub exited unexpectedly, and if so raise an error.
          if fibers.current().parent is None and not self.is_alive() \
                      and self._loop is not None:
              raise RuntimeError('hub exited unexpectedly')
          return value
docs: Switch to the hub.
  
          This method pauses the current fiber and runs the event loop. The
          caller should ensure that it has set up appropriate callbacks so that
          it will get scheduled again, preferably using :class:`switch_back`. In
          this case then return value of this method will be an ``(args,
          kwargs)`` tuple containing the arguments passed to the switch back
          instance.
  
          If this method is called from the root fiber then there are two
          additional cases. If the hub exited due to a call to :meth:`close`,
          then this method returns None. And if the hub exited due to a
          exception, that exception is re-raised here.