Author: carnold
Date: Thu Apr 27 12:33:41 2006
New Revision: 397620
URL: http://svn.apache.org/viewcvs?rev=397620&view=rev
Log:
Bug LOGCXX-132: various segmentation faults
Added:
logging/log4cxx/trunk/tests/src/threadtest.cpp
Modified:
logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
logging/log4cxx/trunk/include/log4cxx/helpers/thread.h
logging/log4cxx/trunk/include/log4cxx/logger.h
logging/log4cxx/trunk/include/log4cxx/spi/loggingevent.h
logging/log4cxx/trunk/src/asyncappender.cpp
logging/log4cxx/trunk/src/filewatchdog.cpp
logging/log4cxx/trunk/src/hierarchy.cpp
logging/log4cxx/trunk/src/loggingevent.cpp
logging/log4cxx/trunk/src/objectptr.cpp
logging/log4cxx/trunk/src/socketappenderskeleton.cpp
logging/log4cxx/trunk/src/sockethubappender.cpp
logging/log4cxx/trunk/src/telnetappender.cpp
logging/log4cxx/trunk/src/thread.cpp
logging/log4cxx/trunk/tests/src/Makefile.am
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h Thu Apr 27
12:33:41 2006
@@ -27,6 +27,7 @@
class LOG4CXX_EXPORT ObjectPtrBase {
public:
static void checkNull(const int& null);
+ static void* exchange(volatile void** destination, void* newValue);
};
@@ -37,23 +38,9 @@
template<typename InterfacePtr> ObjectPtrT(const InterfacePtr& p)
: p(0)
{
- cast(p);
+ cast(p);
}
- // Disable conversion using ObjectPtrT* specialization of
- // template<typename InterfacePtr> ObjectPtrT(const InterfacePtr& p)
-/* template<> explicit ObjectPtrT(ObjectPtrT* const & p)
throw(IllegalArgumentException)
- {
- if (p == 0)
- {
- throw IllegalArgumentException(String());
- }
- else
- {
- this->p = p->p;
- this->p->addRef();
- }
- }*/
ObjectPtrT(const int& null) //throw(IllegalArgumentException)
: p(0)
@@ -87,35 +74,27 @@
{
this->p->releaseRef();
}
- this->p = 0;
+ this->p = 0;
}
// Operators
template<typename InterfacePtr> ObjectPtrT& operator=(const
InterfacePtr& p)
{
- cast(p);
- return *this;
+ cast(p);
+ return *this;
}
- ObjectPtrT& operator=(const ObjectPtrT& p)
- {
- if (this->p != p.p)
- {
- if (this->p != 0)
- {
- this->p->releaseRef();
- }
-
- this->p = p.p;
-
- if (this->p != 0)
- {
- this->p->addRef();
- }
- }
-
+ ObjectPtrT& operator=(const ObjectPtrT& p) {
+ T* newPtr = (T*) p.p;
+ if (newPtr != 0) {
+ newPtr->addRef();
+ }
+ void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, newPtr);
+ if (oldPtr != 0) {
+ ((T*) oldPtr)->releaseRef();
+ }
return *this;
- }
+ }
ObjectPtrT& operator=(const int& null)
//throw(IllegalArgumentException)
{
@@ -123,65 +102,45 @@
// throws IllegalArgumentException if null != 0
//
ObjectPtrBase::checkNull(null);
-
- if (this->p != 0)
- {
- this->p->releaseRef();
- this->p = 0;
- }
-
- return *this;
- }
-
- ObjectPtrT& operator=(T* p)
- {
- if (this->p != p)
- {
- if (this->p != 0)
- {
- this->p->releaseRef();
- }
-
- this->p = p;
-
- if (this->p != 0)
- {
- this->p->addRef();
- }
- }
-
- return *this;
+ void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, 0);
+ if (oldPtr != 0) {
+ ((T*) oldPtr)->releaseRef();
+ }
+ return *this;
+ }
+
+ ObjectPtrT& operator=(T* p) {
+ if (p != 0) {
+ p->addRef();
+ }
+ void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, p);
+ if (oldPtr != 0) {
+ ((T*)oldPtr)->releaseRef();
+ }
+ return *this;
}
bool operator==(const ObjectPtrT& p) const { return (this->p ==
p.p); }
bool operator!=(const ObjectPtrT& p) const { return (this->p !=
p.p); }
bool operator==(const T* p) const { return (this->p == p); }
bool operator!=(const T* p) const { return (this->p != p); }
- T* operator->() {return p; }
- const T* operator->() const {return p; }
- T& operator*() const {return *p; }
- operator T*() const {return p; }
-
- template<typename InterfacePtr> void cast(const InterfacePtr& p)
- {
- if (this->p != 0)
- {
- this->p->releaseRef();
- this->p = 0;
- }
+ T* operator->() {return (T*) p; }
+ const T* operator->() const {return (const T*) p; }
+ T& operator*() const {return (T&) *p; }
+ operator T*() const {return (T*) p; }
- if (p != 0)
+ template<typename InterfacePtr> void cast(const InterfacePtr& p)
{
- this->p = (T*)p->cast(T::getStaticClass());
- if (this->p != 0)
+ T* newPtr = 0;
+ if (p != 0)
{
- this->p->addRef();
+ newPtr = (T*)p->cast(T::getStaticClass());
}
+ operator=(newPtr);
}
- }
- public:
+ private:
T * p;
};
}
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/thread.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/thread.h?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/thread.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/thread.h Thu Apr 27 12:33:41
2006
@@ -18,6 +18,7 @@
#define _LOG4CXX_HELPERS_THREAD_H
#include <log4cxx/log4cxx.h>
+#include <log4cxx/helpers/pool.h>
#if !defined(LOG4CXX_THREAD_FUNC)
#if defined(_WIN32)
@@ -41,8 +42,7 @@
Thread();
~Thread();
- void run(log4cxx::helpers::Pool& pool,
- void* (LOG4CXX_THREAD_FUNC
*start)(log4cxx_thread_t* thread, void* data),
+ void run(void* (LOG4CXX_THREAD_FUNC
*start)(log4cxx_thread_t* thread, void* data),
void* data);
void stop();
void join();
@@ -56,8 +56,9 @@
static void sleep(log4cxx_time_t duration);
private:
+ Pool p;
log4cxx_thread_t* thread;
- volatile bool finished;
+ volatile bool alive;
Thread(const Thread&);
Thread& operator=(const Thread&);
};
Modified: logging/log4cxx/trunk/include/log4cxx/logger.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/logger.h?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/logger.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/logger.h Thu Apr 27 12:33:41 2006
@@ -258,8 +258,7 @@
/**
Return the logger name. */
- inline const LogString& getName() const
- { return name; }
+ const LogString getName() const { return name; }
void getName(std::string& name) const;
#if LOG4CXX_HAS_WCHAR_T
void getName(std::wstring& name) const;
Modified: logging/log4cxx/trunk/include/log4cxx/spi/loggingevent.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/spi/loggingevent.h?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/spi/loggingevent.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/spi/loggingevent.h Thu Apr 27
12:33:41 2006
@@ -92,7 +92,7 @@
{ return level; }
/** Return the name of the #logger. */
- const LogString& getLoggerName() const;
+ const LogString getLoggerName() const;
/** Return the #message for this logging event. */
inline const LogString& getMessage() const
Modified: logging/log4cxx/trunk/src/asyncappender.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/asyncappender.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/asyncappender.cpp (original)
+++ logging/log4cxx/trunk/src/asyncappender.cpp Thu Apr 27 12:33:41 2006
@@ -45,7 +45,7 @@
thread(),
locationInfo(true),
aai(new AppenderAttachableImpl()) {
- thread.run(pool, dispatch, this);
+ thread.run(dispatch, this);
}
AsyncAppender::~AsyncAppender()
Modified: logging/log4cxx/trunk/src/filewatchdog.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/filewatchdog.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/filewatchdog.cpp (original)
+++ logging/log4cxx/trunk/src/filewatchdog.cpp Thu Apr 27 12:33:41 2006
@@ -84,7 +84,7 @@
{
checkAndConfigure();
- thread.run(pool, run, this);
+ thread.run(run, this);
}
#endif
Modified: logging/log4cxx/trunk/src/hierarchy.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/hierarchy.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/hierarchy.cpp (original)
+++ logging/log4cxx/trunk/src/hierarchy.cpp Thu Apr 27 12:33:41 2006
@@ -37,7 +37,7 @@
IMPLEMENT_LOG4CXX_OBJECT(Hierarchy)
-Hierarchy::Hierarchy(const LoggerPtr& root) : root(root),
+Hierarchy::Hierarchy(const LoggerPtr& root) : root(root),
emittedNoAppenderWarning(false), emittedNoResourceBundleWarning(false),
mutex(), configured(false), thresholdInt(Level::ALL_INT),
threshold(Level::getAll())
{
@@ -256,6 +256,8 @@
void Hierarchy::shutdown()
{
+ synchronized sync(mutex);
+
setConfigured(false);
LoggerPtr root = getRootLogger();
@@ -284,15 +286,16 @@
void Hierarchy::updateParents(LoggerPtr& logger)
{
- const LogString& name = logger->getName();
+ const LogString name(logger->getName());
int length = name.size();
bool parentFound = false;
//tcout << _T("UpdateParents called for ") << name << std::endl;
// if name = "w.x.y.z", loop thourgh "w.x.y", "w.x" and "w", but not
"w.x.y.z"
- for(size_t i = name.find_last_of(L'.', length-1); i != LogString::npos;
- i = name.find_last_of(L'.', i-1))
+ for(size_t i = name.find_last_of(LOG4CXX_STR('.'), length-1);
+ i != LogString::npos;
+ i = name.find_last_of(LOG4CXX_STR('.'), i-1))
{
LogString substr = name.substr(0, i);
//tcout << _T("UpdateParents processing ") << substr <<
std::endl;
Modified: logging/log4cxx/trunk/src/loggingevent.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/loggingevent.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/loggingevent.cpp (original)
+++ logging/log4cxx/trunk/src/loggingevent.cpp Thu Apr 27 12:33:41 2006
@@ -79,7 +79,7 @@
}
}
-const LogString& LoggingEvent::getLoggerName() const
+const LogString LoggingEvent::getLoggerName() const
{
return logger->getName();
}
Modified: logging/log4cxx/trunk/src/objectptr.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/objectptr.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/objectptr.cpp (original)
+++ logging/log4cxx/trunk/src/objectptr.cpp Thu Apr 27 12:33:41 2006
@@ -16,6 +16,7 @@
#include <log4cxx/helpers/objectptr.h>
#include <log4cxx/helpers/exception.h>
+#include <apr_atomic.h>
using namespace log4cxx::helpers;
@@ -25,5 +26,9 @@
throw IllegalArgumentException("Attempt to set pointer to a
non-zero numeric value.");
}
+}
+
+void* ObjectPtrBase::exchange(volatile void** destination, void* newValue) {
+ return apr_atomic_casptr(destination, newValue, (const void*) *destination);
}
Modified: logging/log4cxx/trunk/src/socketappenderskeleton.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/socketappenderskeleton.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/socketappenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/socketappenderskeleton.cpp Thu Apr 27 12:33:41
2006
@@ -200,7 +200,7 @@
{
synchronized sync(mutex);
if (thread.isActive()) {
- thread.run(pool, monitor, this);
+ thread.run(monitor, this);
}
}
Modified: logging/log4cxx/trunk/src/sockethubappender.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/sockethubappender.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/sockethubappender.cpp (original)
+++ logging/log4cxx/trunk/src/sockethubappender.cpp Thu Apr 27 12:33:41 2006
@@ -148,7 +148,7 @@
void SocketHubAppender::startServer()
{
- thread.run(pool, monitor, this);
+ thread.run(monitor, this);
}
void* APR_THREAD_FUNC SocketHubAppender::monitor(log4cxx_thread_t* thread,
void* data) {
Modified: logging/log4cxx/trunk/src/telnetappender.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/telnetappender.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/telnetappender.cpp (original)
+++ logging/log4cxx/trunk/src/telnetappender.cpp Thu Apr 27 12:33:41 2006
@@ -55,7 +55,7 @@
if (serverSocket == NULL) {
serverSocket = new ServerSocket(port);
}
- sh.run(pool, acceptConnections, this);
+ sh.run(acceptConnections, this);
}
void TelnetAppender::setOption(const LogString& option,
Modified: logging/log4cxx/trunk/src/thread.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/thread.cpp?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/thread.cpp (original)
+++ logging/log4cxx/trunk/src/thread.cpp Thu Apr 27 12:33:41 2006
@@ -22,20 +22,19 @@
using namespace log4cxx::helpers;
using namespace log4cxx;
-Thread::Thread() : thread(NULL), finished(false) {
+Thread::Thread() : thread(NULL), alive(false) {
}
Thread::~Thread() {
-#if APR_HAS_THREADS
+#if APR_HAS_THREADS
join();
#endif
}
#if APR_HAS_THREADS
-void Thread::run(log4cxx::helpers::Pool& p,
- void* (LOG4CXX_THREAD_FUNC *start)(log4cxx_thread_t* thread, void*
data),
+void Thread::run(void* (LOG4CXX_THREAD_FUNC *start)(log4cxx_thread_t* thread,
void* data),
void* data) {
- if (thread != NULL && !finished) {
+ if (thread != NULL && alive) {
throw ThreadException(0);
}
apr_threadattr_t* attrs;
@@ -43,7 +42,8 @@
if (stat != APR_SUCCESS) {
throw ThreadException(stat);
}
- stat = apr_thread_create((apr_thread_t**) &thread, attrs,
+ alive = true;
+ stat = apr_thread_create((apr_thread_t**) &thread, attrs,
(apr_thread_start_t) start, data, (apr_pool_t*) p.getAPRPool());
if (stat != APR_SUCCESS) {
throw ThreadException(stat);
@@ -51,9 +51,9 @@
}
void Thread::stop() {
- if (thread != NULL && !finished) {
+ if (thread != NULL && alive) {
apr_status_t stat = apr_thread_exit((apr_thread_t*) thread, 0);
- finished = true;
+ alive = false;
thread = NULL;
if (stat != APR_SUCCESS) {
throw ThreadException(stat);
@@ -62,10 +62,10 @@
}
void Thread::join() {
- if (thread != NULL && !finished) {
+ if (thread != NULL && alive) {
apr_status_t startStat;
apr_status_t stat = apr_thread_join(&startStat,
(apr_thread_t*) thread);
- finished = true;
+ alive = false;
thread = NULL;
if (stat != APR_SUCCESS) {
throw ThreadException(stat);
@@ -75,7 +75,7 @@
#endif
void Thread::ending() {
- finished = true;
+ alive = false;
}
Modified: logging/log4cxx/trunk/tests/src/Makefile.am
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/Makefile.am?rev=397620&r1=397619&r2=397620&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/Makefile.am (original)
+++ logging/log4cxx/trunk/tests/src/Makefile.am Thu Apr 27 12:33:41 2006
@@ -39,7 +39,7 @@
helpers/stringhelpertestcase.cpp \
helpers/timezonetestcase.cpp \
helpers/transcodertestcase.cpp \
- helpers/unicodehelpertestcase.cpp
+ helpers/unicodehelpertestcase.cpp
net_tests = \
net/smtpappendertestcase.cpp \
@@ -128,7 +128,8 @@
rollingfileappendertestcase.cpp\
streamtestcase.cpp\
writerappendertestcase.cpp \
- ndctestcase.cpp
+ ndctestcase.cpp \
+ threadtest.cpp
testsuite_LDADD = \
$(top_builddir)/src/liblog4cxx.la