corba/src/java.corba/share/classes/com/sun/corba/se/impl/transport/SelectorImpl.java
changeset 36019 f5596d6af0de
parent 33680 56aa0b79bf5a
child 37620 230612715768
equal deleted inserted replaced
35814:6c644cca3f3f 36019:f5596d6af0de
    24  */
    24  */
    25 
    25 
    26 package com.sun.corba.se.impl.transport;
    26 package com.sun.corba.se.impl.transport;
    27 
    27 
    28 import java.io.IOException;
    28 import java.io.IOException;
       
    29 import java.net.ServerSocket;
    29 import java.nio.channels.ClosedChannelException;
    30 import java.nio.channels.ClosedChannelException;
    30 import java.nio.channels.SelectableChannel;
    31 import java.nio.channels.SelectableChannel;
       
    32 import java.nio.channels.ServerSocketChannel;
    31 import java.nio.channels.SelectionKey;
    33 import java.nio.channels.SelectionKey;
    32 import java.nio.channels.Selector;
    34 import java.nio.channels.Selector;
       
    35 import java.nio.channels.ClosedSelectorException;
    33 import java.util.ArrayList;
    36 import java.util.ArrayList;
    34 import java.util.HashMap;
    37 import java.util.HashMap;
    35 import java.util.Map;
    38 import java.util.Map;
    36 import java.util.Iterator;
    39 import java.util.Iterator;
    37 import java.util.List;
    40 import java.util.List;
       
    41 
    38 
    42 
    39 import com.sun.corba.se.pept.broker.Broker;
    43 import com.sun.corba.se.pept.broker.Broker;
    40 import com.sun.corba.se.pept.transport.Acceptor;
    44 import com.sun.corba.se.pept.transport.Acceptor;
    41 import com.sun.corba.se.pept.transport.Connection;
    45 import com.sun.corba.se.pept.transport.Connection;
    42 import com.sun.corba.se.pept.transport.EventHandler;
    46 import com.sun.corba.se.pept.transport.EventHandler;
   109             SelectionKeyAndOp keyAndOp = new SelectionKeyAndOp(selectionKey, ehOps);
   113             SelectionKeyAndOp keyAndOp = new SelectionKeyAndOp(selectionKey, ehOps);
   110             synchronized(interestOpsList) {
   114             synchronized(interestOpsList) {
   111                 interestOpsList.add(keyAndOp);
   115                 interestOpsList.add(keyAndOp);
   112             }
   116             }
   113             // tell Selector Thread there's an update to a SelectorKey's Ops
   117             // tell Selector Thread there's an update to a SelectorKey's Ops
   114             selector.wakeup();
   118             try {
       
   119                 if (selector != null) {
       
   120                     // wakeup Selector thread to process close request
       
   121                     selector.wakeup();
       
   122                 }
       
   123             } catch (Throwable t) {
       
   124                 if (orb.transportDebugFlag) {
       
   125                     dprint(".registerInterestOps: selector.wakeup: ", t);
       
   126                 }
       
   127             }
   115         }
   128         }
   116         else {
   129         else {
   117             wrapper.selectionKeyInvalid(eventHandler.toString());
   130             wrapper.selectionKeyInvalid(eventHandler.toString());
   118             if (orb.transportDebugFlag) {
   131             if (orb.transportDebugFlag) {
   119                 dprint(".registerInterestOps: EventHandler SelectionKey not valid " + eventHandler);
   132                 dprint(".registerInterestOps: EventHandler SelectionKey not valid " + eventHandler);
   184                 selectionKey = eventHandler.getSelectionKey();
   197                 selectionKey = eventHandler.getSelectionKey();
   185             }
   198             }
   186             if (selectionKey != null) {
   199             if (selectionKey != null) {
   187                 selectionKey.cancel();
   200                 selectionKey.cancel();
   188             }
   201             }
   189             selector.wakeup();
   202             if (selector != null) {
       
   203                 selector.wakeup();
       
   204             }
   190             return;
   205             return;
   191         }
   206         }
   192 
   207 
   193         switch (eventHandler.getInterestOps()) {
   208         switch (eventHandler.getInterestOps()) {
   194         case SelectionKey.OP_ACCEPT :
   209         case SelectionKey.OP_ACCEPT :
   237         while (i.hasNext()) {
   252         while (i.hasNext()) {
   238             ReaderThread readerThread = (ReaderThread) i.next();
   253             ReaderThread readerThread = (ReaderThread) i.next();
   239             readerThread.close();
   254             readerThread.close();
   240         }
   255         }
   241 
   256 
       
   257        clearDeferredRegistrations();
       
   258 
   242         // Selector
   259         // Selector
   243 
   260 
   244         try {
   261         try {
   245             if (selector != null) {
   262             if (selector != null) {
   246                 // wakeup Selector thread to process close request
   263                 // wakeup Selector thread to process close request
   247                 selector.wakeup();
   264                 selector.wakeup();
   248             }
   265             }
   249         } catch (Throwable t) {
   266         } catch (Throwable t) {
   250             if (orb.transportDebugFlag) {
   267             if (orb.transportDebugFlag) {
   251                 dprint(".close: selector.close: " + t);
   268                 dprint(".close: selector.wakeup: ", t);
   252             }
   269             }
   253         }
   270         }
   254     }
   271     }
   255 
   272 
   256     ///////////////////////////////////////////////////
   273     ///////////////////////////////////////////////////
   271                 enableInterestOps();
   288                 enableInterestOps();
   272                 try {
   289                 try {
   273                     n = selector.select(timeout);
   290                     n = selector.select(timeout);
   274                 } catch (IOException  e) {
   291                 } catch (IOException  e) {
   275                     if (orb.transportDebugFlag) {
   292                     if (orb.transportDebugFlag) {
   276                         dprint(".run: selector.select: " + e);
   293                         dprint(".run: selector.select: ", e);
   277                     }
   294                     }
       
   295                 } catch (ClosedSelectorException csEx) {
       
   296                     if (orb.transportDebugFlag) {
       
   297                         dprint(".run: selector.select: ", csEx);
       
   298                     }
       
   299                     break;
   278                 }
   300                 }
   279                 if (closed) {
   301                 if (closed) {
   280                     selector.close();
   302                     break;
   281                     if (orb.transportDebugFlag) {
       
   282                         dprint(".run: closed - .run return");
       
   283                     }
       
   284                     return;
       
   285                 }
   303                 }
   286                 /*
   304                 /*
   287                   if (timeout == 0 && orb.transportDebugFlag) {
   305                   if (timeout == 0 && orb.transportDebugFlag) {
   288                   dprint(".run: selector.select() returned: " + n);
   306                   dprint(".run: selector.select() returned: " + n);
   289                   }
   307                   }
   319                 if (orb.transportDebugFlag) {
   337                 if (orb.transportDebugFlag) {
   320                     dprint(".run: ignoring", t);
   338                     dprint(".run: ignoring", t);
   321                 }
   339                 }
   322             }
   340             }
   323         }
   341         }
       
   342         try {
       
   343             if (selector != null) {
       
   344                 if (orb.transportDebugFlag) {
       
   345                     dprint(".run: selector.close ");
       
   346                 }
       
   347                 selector.close();
       
   348             }
       
   349         } catch (Throwable t) {
       
   350             if (orb.transportDebugFlag) {
       
   351                 dprint(".run: selector.close: ", t);
       
   352             }
       
   353         }
   324     }
   354     }
   325 
   355 
   326     /////////////////////////////////////////////////////
   356     /////////////////////////////////////////////////////
   327     //
   357     //
   328     // Implementation.
   358     // Implementation.
   329     //
   359     //
   330 
   360 
       
   361     private void clearDeferredRegistrations() {
       
   362         synchronized (deferredRegistrations) {
       
   363             int deferredListSize = deferredRegistrations.size();
       
   364             if (orb.transportDebugFlag) {
       
   365                 dprint(".clearDeferredRegistrations:deferred list size == " + deferredListSize);
       
   366             }
       
   367             for (int i = 0; i < deferredListSize; i++) {
       
   368                 EventHandler eventHandler =
       
   369                     (EventHandler)deferredRegistrations.get(i);
       
   370                 if (orb.transportDebugFlag) {
       
   371                     dprint(".clearDeferredRegistrations: " + eventHandler);
       
   372                 }
       
   373                 SelectableChannel channel = eventHandler.getChannel();
       
   374                 SelectionKey selectionKey = null;
       
   375 
       
   376                 try {
       
   377                     if (orb.transportDebugFlag) {
       
   378                         dprint(".clearDeferredRegistrations:close channel == "
       
   379                                 + channel);
       
   380                         dprint(".clearDeferredRegistrations:close channel class == "
       
   381                                 + channel.getClass().getName());
       
   382                     }
       
   383                     channel.close();
       
   384                     selectionKey = eventHandler.getSelectionKey();
       
   385                     if (selectionKey != null) {
       
   386                         selectionKey.cancel();
       
   387                         selectionKey.attach(null);
       
   388                     }
       
   389                 } catch (IOException ioEx) {
       
   390                     if (orb.transportDebugFlag) {
       
   391                         dprint(".clearDeferredRegistrations: ", ioEx);
       
   392                     }
       
   393                 }
       
   394             }
       
   395             deferredRegistrations.clear();
       
   396         }
       
   397     }
       
   398 
   331     private synchronized boolean isClosed ()
   399     private synchronized boolean isClosed ()
   332     {
   400     {
   333         return closed;
   401         return closed;
   334     }
   402     }
   335 
   403 
   342     {
   410     {
   343         try {
   411         try {
   344             selector = Selector.open();
   412             selector = Selector.open();
   345         } catch (IOException e) {
   413         } catch (IOException e) {
   346             if (orb.transportDebugFlag) {
   414             if (orb.transportDebugFlag) {
   347                 dprint(".startSelector: Selector.open: IOException: " + e);
   415                 dprint(".startSelector: Selector.open: IOException: ", e);
   348             }
   416             }
   349             // REVISIT - better handling/reporting
   417             // REVISIT - better handling/reporting
   350             RuntimeException rte =
   418             RuntimeException rte =
   351                 new RuntimeException(".startSelector: Selector.open exception");
   419                 new RuntimeException(".startSelector: Selector.open exception");
   352             rte.initCause(e);
   420             rte.initCause(e);
   377                         channel.register(selector,
   445                         channel.register(selector,
   378                                          eventHandler.getInterestOps(),
   446                                          eventHandler.getInterestOps(),
   379                                          (Object)eventHandler);
   447                                          (Object)eventHandler);
   380                 } catch (ClosedChannelException e) {
   448                 } catch (ClosedChannelException e) {
   381                     if (orb.transportDebugFlag) {
   449                     if (orb.transportDebugFlag) {
   382                         dprint(".handleDeferredRegistrations: " + e);
   450                         dprint(".handleDeferredRegistrations: ", e);
   383                     }
   451                     }
   384                 }
   452                 }
   385                 eventHandler.setSelectionKey(selectionKey);
   453                 eventHandler.setSelectionKey(selectionKey);
   386             }
   454             }
   387             deferredRegistrations.clear();
   455             deferredRegistrations.clear();