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]