diff options
Diffstat (limited to 'src/java.corba/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java')
-rw-r--r-- | src/java.corba/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/java.corba/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java b/src/java.corba/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java new file mode 100644 index 0000000..62fd7d1 --- /dev/null +++ b/src/java.corba/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.corba.se.impl.transport; + +import java.nio.channels.SelectionKey; + +import org.omg.CORBA.INTERNAL; + +import com.sun.corba.se.pept.transport.Acceptor; +import com.sun.corba.se.pept.transport.Connection; +import com.sun.corba.se.pept.transport.EventHandler; + +import com.sun.corba.se.spi.orb.ORB; +import com.sun.corba.se.spi.orbutil.threadpool.NoSuchThreadPoolException; +import com.sun.corba.se.spi.orbutil.threadpool.NoSuchWorkQueueException; +import com.sun.corba.se.spi.orbutil.threadpool.Work; + +import com.sun.corba.se.impl.orbutil.ORBUtility; + +public abstract class EventHandlerBase + implements + EventHandler +{ + protected ORB orb; + protected Work work; + protected boolean useWorkerThreadForEvent; + protected boolean useSelectThreadToWait; + protected SelectionKey selectionKey; + + //////////////////////////////////////////////////// + // + // EventHandler methods + // + + public void setUseSelectThreadToWait(boolean x) + { + useSelectThreadToWait = x; + } + + public boolean shouldUseSelectThreadToWait() + { + return useSelectThreadToWait; + } + + public void setSelectionKey(SelectionKey selectionKey) + { + this.selectionKey = selectionKey; + } + + public SelectionKey getSelectionKey() + { + return selectionKey; + } + + /* + * NOTE: + * This is not thread-safe by design. + * Only one thread should call it - a reader/listener/select thread. + * Not stateless: interest ops, registration. + */ + public void handleEvent() + { + if (orb.transportDebugFlag) { + dprint(".handleEvent->: " + this); + } + getSelectionKey().interestOps(getSelectionKey().interestOps() & + (~ getInterestOps())); + if (shouldUseWorkerThreadForEvent()) { + Throwable throwable = null; + try { + if (orb.transportDebugFlag) { + dprint(".handleEvent: addWork to pool: " + 0); + } + orb.getThreadPoolManager().getThreadPool(0) + .getWorkQueue(0).addWork(getWork()); + } catch (NoSuchThreadPoolException e) { + throwable = e; + } catch (NoSuchWorkQueueException e) { + throwable = e; + } + // REVISIT: need to close connection. + if (throwable != null) { + if (orb.transportDebugFlag) { + dprint(".handleEvent: " + throwable); + } + INTERNAL i = new INTERNAL("NoSuchThreadPoolException"); + i.initCause(throwable); + throw i; + } + } else { + if (orb.transportDebugFlag) { + dprint(".handleEvent: doWork"); + } + getWork().doWork(); + } + if (orb.transportDebugFlag) { + dprint(".handleEvent<-: " + this); + } + } + + public boolean shouldUseWorkerThreadForEvent() + { + return useWorkerThreadForEvent; + } + + public void setUseWorkerThreadForEvent(boolean x) + { + useWorkerThreadForEvent = x; + } + + public void setWork(Work work) + { + this.work = work; + } + + public Work getWork() + { + return work; + } + + private void dprint(String msg) + { + ORBUtility.dprint("EventHandlerBase", msg); + } +} + +// End of file. |