public void feed(Object obj) {
            synchronized(BalancedPoolStageDriver.this) {
                if (    !isInState(RUNNING, STOP_REQUESTED)
                        || workers.size() > 1
                        || (workers.size() == 1 && workers.peek().runnability == Runnability.RUNNABLE)) {
                    try {
                        if (log.isDebugEnabled()) log.debug(stage + ": Queueing object: " + obj);
                        this.queue.put(obj);
                    } catch (InterruptedException e) {
                        throw new Error("Assertion failure: thread interrupted while attempting to enqueue data object.", e);
                    }
                    
                    return; //short circuit out of here
                }
            }
            
            try {
                if (log.isDebugEnabled()) log.debug(stage + ":Processing object directly: " + obj);
                BalancedPoolStageDriver.this.process(obj);
            } catch (StageException e) {
                recordProcessingException(obj, e);
                if (faultTolerance == FaultTolerance.NONE) throw fatalError(e);
            }
        }