You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ad...@apache.org on 2004/05/02 01:16:22 UTC

cvs commit: incubator-geronimo/modules/network/src/java/org/apache/geronimo/network SelectorManager.java

adc         2004/05/01 16:16:22

  Modified:    modules/network/src/java/org/apache/geronimo/network
                        SelectorManager.java
  Log:
  Put in work-around for NPE from NIO impl.
  
  SelectorManager will now not stop when a key is canceled.
  
  Revision  Changes    Path
  1.7       +51 -37    incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/SelectorManager.java
  
  Index: SelectorManager.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/SelectorManager.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- SelectorManager.java	25 Apr 2004 02:03:37 -0000	1.6
  +++ SelectorManager.java	1 May 2004 23:16:22 -0000	1.7
  @@ -129,49 +129,52 @@
               log.debug("Selector Work thread has started.");
               log.debug("Selector Manager timeout: "+timeout);
               while (running) {
  +                try {
   
  -                synchronized (guard) { /* do nothing */
  -                    log.trace("Waiting for selector to return.");
  -                }
  -                
  -                if (selector.select(timeout) == 0) continue;
  -                
  -                // Get a java.util.Set containing the SelectionKey objects for
  -                // all channels that are ready for I/O.
  -                Set keys = selector.selectedKeys();
  -
  -                // Use a java.util.Iterator to loop through the selected keys
  -                for (Iterator i = keys.iterator(); i.hasNext();) {
  -                    final SelectionKey key = (SelectionKey) i.next();
  -
  -                    if (key.isReadable()) { 
  -                        log.trace("-OP_READ " + key);
  -                        key.interestOps(key.interestOps() & (~SelectionKey.OP_READ));
  -                    }
  -                    if (key.isWritable()) {
  -                        log.trace("-OP_WRITE " + key);
  -                        key.interestOps(key.interestOps() & (~SelectionKey.OP_WRITE));
  -                    }
  -                    if (key.isAcceptable()) {
  -                        log.trace("-OP_ACCEPT " + key);
  -                        key.interestOps(key.interestOps() & (~SelectionKey.OP_ACCEPT));
  +                    synchronized (guard) { /* do nothing */
  +                        log.trace("Waiting for selector to return.");
                       }
   
  -                    threadPool.getWorkManager().execute(new Runnable() {
  -                        public void run() {
  -                            try {
  -                                ((SelectionEventListner) key.attachment()).selectionEvent(key);
  -                            } catch (Throwable e) {
  -                                log.trace("Request Failed.", e);
  -                            }
  +                    if (selector.select(timeout) == 0) continue;
  +
  +                    // Get a java.util.Set containing the SelectionKey objects for
  +                    // all channels that are ready for I/O.
  +                    Set keys = selector.selectedKeys();
  +
  +                    // Use a java.util.Iterator to loop through the selected keys
  +                    for (Iterator i = keys.iterator(); i.hasNext();) {
  +                        final SelectionKey key = (SelectionKey) i.next();
  +
  +                        if (key.isReadable()) {
  +                            log.trace("-OP_READ " + key);
  +                            key.interestOps(key.interestOps() & (~SelectionKey.OP_READ));
  +                        }
  +                        if (key.isWritable()) {
  +                            log.trace("-OP_WRITE " + key);
  +                            key.interestOps(key.interestOps() & (~SelectionKey.OP_WRITE));
                           }
  -                    });
  +                        if (key.isAcceptable()) {
  +                            log.trace("-OP_ACCEPT " + key);
  +                            key.interestOps(key.interestOps() & (~SelectionKey.OP_ACCEPT));
  +                        }
  +
  +                        threadPool.getWorkManager().execute(new Runnable() {
  +                            public void run() {
  +                                try {
  +                                    ((SelectionEventListner) key.attachment()).selectionEvent(key);
  +                                } catch (Throwable e) {
  +                                    log.trace("Request Failed.", e);
  +                                }
  +                            }
  +                        });
   
  -                    i.remove(); // Remove the key from the set of selected keys
  +                        i.remove(); // Remove the key from the set of selected keys
  +                    }
  +                    
  +                } catch (CancelledKeyException e) {
  +                    log.debug("Key has Been Cancelled: "+e);
                   }
               }
  -        } catch (CancelledKeyException e) {
  -            log.debug("Key has Been Cancelled: "+e);
           } catch (IOException e) {
               log.warn("IOException occured.", e);
           } catch (InterruptedException e) {
  @@ -188,12 +191,23 @@
               return key;
           }
       }
  +    public void closeChannel(SelectableChannel selectableChannel) throws IOException {
  +        synchronized (guard) {
  +            selector.wakeup();
  +            selectableChannel.keyFor(selector).cancel();
  +            selectableChannel.close();
  +        }
  +    }
   
       public void addInterestOps(SelectionKey selectorKey, int addOpts) {
           synchronized (guard) {
               selector.wakeup();
               selectorKey.interestOps( selectorKey.interestOps() | addOpts );
           }
  +    }
  +
  +    public void wakeup() {
  +        selector.wakeup();
       }
   
       public void setGBeanContext(GBeanContext context) {