code: func (c *controller) processLoop() {
  	for {
  		obj, err := c.config.Queue.Pop(PopProcessFunc(c.config.Process))
  		if err != nil {
  			if err == FIFOClosedError {
  				return
  			}
  			if c.config.RetryOnError {
  				// This is the safe way to re-enqueue.
  				c.config.Queue.AddIfNotPresent(obj)
  			}
  		}
  	}
  }
docs: // processLoop drains the work queue.
  // TODO: Consider doing the processing in parallel. This will require a little thought
  // to make sure that we don't end up processing the same object multiple times
  // concurrently.
  //
  // TODO: Plumb through the stopCh here (and down to the queue) so that this can
  // actually exit when the controller is stopped. Or just give up on this stuff
  // ever being stoppable. Converting this whole package to use Context would
  // also be helpful.