def request_io(self, iocb):
        """Called by a client to start processing a request."""
        if _debug: IOQController._debug("request_io %r", iocb)

        # bind the iocb to this controller
        iocb.ioController = self

        # if we're busy, queue it
        if (self.state != CTRL_IDLE):
            if _debug: IOQController._debug("    - busy, request queued, active_iocb: %r", self.active_iocb)

            iocb.ioState = PENDING
            self.ioQueue.put(iocb)
            return

        try:
            # hopefully there won't be an error
            err = None

            # let derived class figure out how to process this
            self.process_io(iocb)
        except:
            # extract the error
            err = sys.exc_info()[1]
            if _debug: IOQController._debug("    - process_io() exception: %r", err)

        # if there was an error, abort the request
        if err:
            if _debug: IOQController._debug("    - aborting")
            self.abort_io(iocb, err)
Called by a client to start processing a request.