private void sendToDiscriminators(VirtualConnection inVC, TCPReadRequestContext req, boolean errorOnRead) {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
            Tr.entry(tc, "sendToDiscriminators");
        }
        boolean doAgain;
        req.setJITAllocateSize(0); // JIT Allocate was on for the initial read,
                                   // reset it
        TCPConnLink conn = ((TCPReadRequestContextImpl) req).getTCPConnLink();
        VirtualConnection vc = inVC;
        do {
            doAgain = false;
            int state;
            try {
                state = tcpChannel.getDiscriminationProcess().discriminate(vc, req.getBuffers(), conn);
            } catch (DiscriminationProcessException dpe) {
                if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                    Tr.event(tc, "Exception occurred while discriminating data received from client " + req.getInterface().getRemoteAddress() + " "
                                 + req.getInterface().getRemotePort());
                ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, new IOException("Discrimination failed " + dpe.getMessage()));
                break;
            }
            if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                Tr.debug(tc, "Discrimination returned " + state);
            }

            if (state == DiscriminationProcess.SUCCESS) {

                ConnectionReadyCallback cb = conn.getApplicationCallback();
                // is cb is null, then connlink may have been destroyed by channel stop
                // if so, nothing more needs to be done
                if (cb != null) {
                    if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                        Tr.event(tc, "Calling application callback.ready method");
                    }
                    cb.ready(vc);
                } else {
                    if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled()) {
                        Tr.event(tc, "No application callback found, closing connection");
                    }
                    ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
                }
            } else if (state == DiscriminationProcess.AGAIN) {
                if (errorOnRead) { // error on first read, don't retry
                    if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                        Tr.event(tc, "First read timed out, and more than one discriminator asked for more data" + req.getInterface().getRemoteAddress() + " "
                                     + req.getInterface().getRemotePort());
                    ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
                } else if (requestFull(req)) {
                    if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                        Tr.event(tc, "Discrimination failed, no one claimed data even after 1 complete buffer presented - probably garbage passed in"
                                     + req.getInterface().getRemoteAddress()
                                     + " " + req.getInterface().getRemotePort());
                    ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);

                } else {
                    vc = req.read(1, this, false, TCPRequestContext.USE_CHANNEL_TIMEOUT);
                    if (vc != null) {
                        doAgain = true;
                    }

                }
            } else { // FAILURE
                if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                    Tr.event(tc, "Error occurred while discriminating data received from client " + req.getInterface().getRemoteAddress() + " "
                                 + req.getInterface().getRemotePort());
                ((TCPReadRequestContextImpl) req).getTCPConnLink().close(vc, null);
            }
        } while (doAgain);

        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
            Tr.exit(tc, "sendToDiscriminators");
        }
    }
private void sendToDiscriminators ( VirtualConnection inVC , TCPReadRequestContext req , boolean errorOnRead ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) { Tr . entry ( tc , "sendToDiscriminators" ) ; } boolean doAgain ; req . setJITAllocateSize ( 0 ) ; TCPConnLink conn = ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) ; VirtualConnection vc = inVC ; do { doAgain = false ; int state ; try { state = tcpChannel . getDiscriminationProcess ( ) . discriminate ( vc , req . getBuffers ( ) , conn ) ; } catch ( DiscriminationProcessException dpe ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) Tr . event ( tc , "Exception occurred while discriminating data received from client " + req . getInterface ( ) . getRemoteAddress ( ) + " " + req . getInterface ( ) . getRemotePort ( ) ) ; ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) . close ( vc , new IOException ( "Discrimination failed " + dpe . getMessage ( ) ) ) ; break ; } if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isDebugEnabled ( ) ) { Tr . debug ( tc , "Discrimination returned " + state ) ; } if ( state == DiscriminationProcess . SUCCESS ) { ConnectionReadyCallback cb = conn . getApplicationCallback ( ) ; if ( cb != null ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) { Tr . event ( tc , "Calling application callback.ready method" ) ; } cb . ready ( vc ) ; } else { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) { Tr . event ( tc , "No application callback found, closing connection" ) ; } ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) . close ( vc , null ) ; } } else if ( state == DiscriminationProcess . AGAIN ) { if ( errorOnRead ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) Tr . event ( tc , "First read timed out, and more than one discriminator asked for more data" + req . getInterface ( ) . getRemoteAddress ( ) + " " + req . getInterface ( ) . getRemotePort ( ) ) ; ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) . close ( vc , null ) ; } else if ( requestFull ( req ) ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) Tr . event ( tc , "Discrimination failed, no one claimed data even after 1 complete buffer presented - probably garbage passed in" + req . getInterface ( ) . getRemoteAddress ( ) + " " + req . getInterface ( ) . getRemotePort ( ) ) ; ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) . close ( vc , null ) ; } else { vc = req . read ( 1 , this , false , TCPRequestContext . USE_CHANNEL_TIMEOUT ) ; if ( vc != null ) { doAgain = true ; } } } else { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEventEnabled ( ) ) Tr . event ( tc , "Error occurred while discriminating data received from client " + req . getInterface ( ) . getRemoteAddress ( ) + " " + req . getInterface ( ) . getRemotePort ( ) ) ; ( ( TCPReadRequestContextImpl ) req ) . getTCPConnLink ( ) . close ( vc , null ) ; } } while ( doAgain ) ; if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) { Tr . exit ( tc , "sendToDiscriminators" ) ; } }
invoke discrimination process.

@param inVC
@param req
@param errorOnRead