You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by Stephane Hamel <sh...@solvision.net> on 2006/02/15 22:26:06 UTC
AsyncAppender::close() throws ThreadException (bug?)
Hello,
I compiled CVS Head (change list 374751, Feb 3, 2006) using the following
command:
Ant -Dcompiler=msvc -Ddebug=true build
I use Visual Studio 2005.
I tried to make the simplest program to isolate the problem. Here's the
program:
#include [...]
using namespace log4cxx;
int _tmain(int argc, _TCHAR* argv[])
{
try
{
xml::DOMConfigurator::configure("LoggerConfigAsync.xml");
}
catch(helpers::ThreadException& e)
{
return 1;
}
return 0;
}
The LoggerConfigAsync.xml file content is:
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true">
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="CONSOLE"/>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%t] %C{2} - %m%n"/>
</layout>
</appender>
<root>
<priority value="debug"/>
<appender-ref ref="ASYNC"/>
</root>
</log4j:configuration>
This application will throw an exception from within AsyncAppender::close()
method. The exception occurs when the function calls thread.join(). In
thread.join(), there's a call to apr_thread_join. Finally, in
apr_thread_join, it waits for the worker thread to terminate. After that, it
checks for thd->pool to be NULL. In my case, it is not and it returns
APR_INCOMPLETE, which is later throwned as a ThreadException.
The exception message is Thread exception: stat = 70008. (70008 =
APR_INCOMPLETE)
If, after the line:
xml::DOMConfigurator::configure("LoggerConfigAsync.xml");
I add the following lines:
LoggerPtr rootLogger = Logger::getRootLogger();
LOG4CXX_INFO(rootLogger, "information message");
LOG4CXX_DEBUG(rootLogger, "Closing AsyncAppender");
AsyncAppenderPtr async = rootLogger->getAppender(_T("ASYNC"));
async->close();
I will see the info and debug messages in the console, but it will crash in
the close() method anyway.
Is this "bug" occuring only w/ VS8 ?
Or is me that doesn't understand how to use this appender ?
Stéphane Hamel
SolVision
50, rue de Lauzon
Boucherville, Suite 100
(Québec) Canada, J4B 1E6
Phone: (450) 679-9542 x211
RE: AsyncAppender::close() throws ThreadException (bug?)
Posted by Stephane Hamel <sh...@solvision.net>.
I believe I fixed the problem. I would like some feedback on the
modification I did to the code to get a normal termination of my test
application:
In the function AsyncAppender::dispatch I changed the code
if (count == 0) {
if (pThis->closed) {
return 0; // original line
}
pThis->pending.wait();
if (count == 0) {
if (pThis->closed) {
pThis->thread.stop(); // modified line
}
pThis->pending.wait();
-Stephane
-----Original Message-----
From: Stephane Hamel [mailto:shamel@solvision.net]
Sent: February 15, 2006 4:26 PM
To: log4cxx-user@logging.apache.org
Subject: AsyncAppender::close() throws ThreadException (bug?)
Hello,
I compiled CVS Head (change list 374751, Feb 3, 2006) using the following
command:
Ant -Dcompiler=msvc -Ddebug=true build
I use Visual Studio 2005.
I tried to make the simplest program to isolate the problem. Here's the
program:
#include [...]
using namespace log4cxx;
int _tmain(int argc, _TCHAR* argv[])
{
try
{
xml::DOMConfigurator::configure("LoggerConfigAsync.xml");
}
catch(helpers::ThreadException& e)
{
return 1;
}
return 0;
}
The LoggerConfigAsync.xml file content is:
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true">
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="CONSOLE"/>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%t] %C{2} - %m%n"/>
</layout>
</appender>
<root>
<priority value="debug"/>
<appender-ref ref="ASYNC"/>
</root>
</log4j:configuration>
This application will throw an exception from within AsyncAppender::close()
method. The exception occurs when the function calls thread.join(). In
thread.join(), there's a call to apr_thread_join. Finally, in
apr_thread_join, it waits for the worker thread to terminate. After that, it
checks for thd->pool to be NULL. In my case, it is not and it returns
APR_INCOMPLETE, which is later throwned as a ThreadException.
The exception message is Thread exception: stat = 70008. (70008 =
APR_INCOMPLETE)
If, after the line:
xml::DOMConfigurator::configure("LoggerConfigAsync.xml");
I add the following lines:
LoggerPtr rootLogger = Logger::getRootLogger();
LOG4CXX_INFO(rootLogger, "information message");
LOG4CXX_DEBUG(rootLogger, "Closing AsyncAppender");
AsyncAppenderPtr async = rootLogger->getAppender(_T("ASYNC"));
async->close();
I will see the info and debug messages in the console, but it will crash in
the close() method anyway.
Is this "bug" occuring only w/ VS8 ?
Or is me that doesn't understand how to use this appender ?
Stéphane Hamel
SolVision
50, rue de Lauzon
Boucherville, Suite 100
(Québec) Canada, J4B 1E6
Phone: (450) 679-9542 x211