carnold     2005/07/22 11:02:04

  Modified:    src/java/org/apache/log4j AsyncAppender.java
               tests/src/java/org/apache/log4j AsyncAppenderTestCase.java
  Log:
  Bug 23021: AsyncAppender blocks on thread death
  
  Revision  Changes    Path
  1.48      +10 -0     
logging-log4j/src/java/org/apache/log4j/AsyncAppender.java
  
  Index: AsyncAppender.java
  ===================================================================
  RCS file: 
/home/cvs/logging-log4j/src/java/org/apache/log4j/AsyncAppender.java,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- AsyncAppender.java        8 Mar 2005 22:32:56 -0000       1.47
  +++ AsyncAppender.java        22 Jul 2005 18:02:04 -0000      1.48
  @@ -81,6 +81,16 @@
     }
   
     public void append(LoggingEvent event) {
  +    //
  +    //   if dispatcher thread has died then
  +    //      append subsequent events synchronously
  +    //   See bug 23021
  +    if (!dispatcher.isAlive()) {
  +        synchronized(aai) {
  +            aai.appendLoopOnAppenders(event);
  +        }
  +        return;
  +    }
       // extract all the thread dependent information now as later it will
       // be too late.
       event.prepareForDeferredProcessing();
  
  
  
  1.9       +40 -7     
logging-log4j/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java
  
  Index: AsyncAppenderTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/logging-log4j/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AsyncAppenderTestCase.java        8 Mar 2005 22:32:57 -0000       1.8
  +++ AsyncAppenderTestCase.java        22 Jul 2005 18:02:04 -0000      1.9
  @@ -22,6 +22,8 @@
   
   import java.util.Vector;
   
  +import org.apache.log4j.spi.LoggingEvent;
  +
   
   /**
      A superficial but general test of log4j.
  @@ -93,13 +95,44 @@
       assertTrue(vectorAppender.isClosed());
     }
   
  -  // rename the method to suite() to have all tests executed. Rebame the 
method
  -  // to Xsuite to have only selected tests executed.
  -  public static Test XXsuite() {
  -    TestSuite suite = new TestSuite();
  -    suite.addTest(new AsyncAppenderTestCase("test1"));
  -    //suite.addTest(new AsyncAppenderTestCase("closeTest"));
  +  private static class NullPointerAppender extends AppenderSkeleton {
  +        public NullPointerAppender() {
  +          super(true);
  +        }
  +
  +
  +        /**
  +           This method is called by the [EMAIL PROTECTED] 
AppenderSkeleton#doAppend}
  +           method.
  +
  +        */
  +        public void append(LoggingEvent event) {
  +            throw new NullPointerException();
  +        }
  +
  +        public void close() {
  +        }
  +
  +        public boolean requiresLayout() {
  +          return false;
  +        }
  +  }
  +
   
  -    return suite;
  +  public void testBadAppender() throws Exception {
  +      Appender nullPointerAppender = new NullPointerAppender();
  +      asyncAppender.addAppender(nullPointerAppender);
  +      asyncAppender.setBufferSize(5);
  +      asyncAppender.activateOptions();
  +      root.addAppender(nullPointerAppender);
  +      try {
  +         root.info("Message");
  +         Thread.sleep(10);
  +         root.info("Message");
  +         fail("Should have thrown exception");
  +      } catch(NullPointerException ex) {
  +
  +      }
     }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to