FileDocCategorySizeDatePackage
ReaderThreadImpl.javaAPI DocJava SE 5 API2851Fri Aug 26 14:54:34 BST 2005com.sun.corba.se.impl.transport

ReaderThreadImpl.java

/*
 * @(#)ReaderThreadImpl.java	1.13 03/12/19
 * 
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.corba.se.impl.transport;

import java.io.IOException;

import com.sun.corba.se.pept.transport.Connection;
import com.sun.corba.se.pept.transport.ReaderThread;
import com.sun.corba.se.pept.transport.Selector;

import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.orbutil.threadpool.Work;

import com.sun.corba.se.impl.orbutil.ORBUtility;

public class ReaderThreadImpl
    implements
	ReaderThread,
	Work
{
    private ORB orb;
    private Connection connection;
    private Selector selector;
    private boolean keepRunning;
    private long enqueueTime;

    public ReaderThreadImpl(ORB orb, 
			    Connection connection, Selector selector)
    {
	this.orb = orb;
	this.connection = connection;
	this.selector = selector;
	keepRunning = true;
    }

    ////////////////////////////////////////////////////
    // 
    // ReaderThread methods.
    //

    public Connection getConnection()
    {
	return connection;
    }

    public void close()
    {
	if (orb.transportDebugFlag) {
	    dprint(".close: " + connection);
	}

	keepRunning = false;
    }

    ////////////////////////////////////////////////////
    //
    // Work methods.
    //

    // REVISIT - this needs alot more from previous ReaderThread.
    public void doWork()
    {
	try {
	    if (orb.transportDebugFlag) {
		dprint(".doWork: Start ReaderThread: " + connection);
	    }
	    while (keepRunning) {
		try {

		    if (orb.transportDebugFlag) {
			dprint(".doWork: Start ReaderThread cycle: " 
			       + connection);
		    }

		    if (connection.read()) {
			// REVISIT - put in pool;
			return;
		    }

		    if (orb.transportDebugFlag) {
			dprint(".doWork: End ReaderThread cycle: "
			       + connection);
		    }

		} catch (Throwable t) {
		    if (orb.transportDebugFlag) {
			dprint(".doWork: exception in read: " + connection,t);
		    }
		    orb.getTransportManager().getSelector(0)
			.unregisterForEvent(getConnection().getEventHandler());
		    getConnection().close();
		}
	    }
	} finally {
	    if (orb.transportDebugFlag) {
		dprint(".doWork: Terminated ReaderThread: " + connection);
	    }
	}
    }

    public void setEnqueueTime(long timeInMillis) 
    {
	enqueueTime = timeInMillis;
    }

    public long getEnqueueTime() 
    {
	return enqueueTime;
    }

    public String getName() { return "ReaderThread"; }

    ////////////////////////////////////////////////////
    //
    // Implementation.
    //

    private void dprint(String msg)
    {
	ORBUtility.dprint("ReaderThreadImpl", msg);
    }

    protected void dprint(String msg, Throwable t)
    {
	dprint(msg);
	t.printStackTrace(System.out);
    }
}

// End of file.