Author: carnold
Date: Tue May 9 13:49:05 2006
New Revision: 405530
URL: http://svn.apache.org/viewcvs?rev=405530&view=rev
Log:
LOGCXX-132: Tweaking hierarchy to hopefully avoid seg faults in ThreadTest
Modified:
logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
logging/log4cxx/trunk/include/log4cxx/hierarchy.h
logging/log4cxx/trunk/src/hierarchy.cpp
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h?rev=405530&r1=405529&r2=405530&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h Tue May 9
13:49:05 2006
@@ -70,11 +70,10 @@
~ObjectPtrT()
{
- if (this->p != 0)
- {
- this->p->releaseRef();
- }
- this->p = 0;
+ void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, 0);
+ if (oldPtr != 0) {
+ ((T*) oldPtr)->releaseRef();
+ }
}
// Operators
Modified: logging/log4cxx/trunk/include/log4cxx/hierarchy.h
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/hierarchy.h?rev=405530&r1=405529&r2=405530&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/hierarchy.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/hierarchy.h Tue May 9 13:49:05 2006
@@ -256,7 +256,7 @@
We add 'cat' to the list of children for this potential parent.
*/
- void updateParents(LoggerPtr& logger);
+ void updateParents(LoggerPtr logger);
/**
We update the links for all the children that placed themselves
@@ -275,7 +275,7 @@
Hierarchy(const Hierarchy&);
Hierarchy& operator=(const Hierarchy&);
- void updateChildren(ProvisionNode& pn, LoggerPtr& logger);
+ void updateChildren(ProvisionNode& pn, LoggerPtr logger);
log4cxx::helpers::Mutex mutex;
volatile log4cxx_uint32_t configured;
};
Modified: logging/log4cxx/trunk/src/hierarchy.cpp
URL:
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/hierarchy.cpp?rev=405530&r1=405529&r2=405530&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/hierarchy.cpp (original)
+++ logging/log4cxx/trunk/src/hierarchy.cpp Tue May 9 13:49:05 2006
@@ -29,6 +29,7 @@
#include <log4cxx/helpers/aprinitializer.h>
#include <log4cxx/defaultconfigurator.h>
#include <apr_atomic.h>
+#include "assert.h"
using namespace log4cxx;
@@ -160,23 +161,17 @@
LoggerPtr Hierarchy::getLogger(const LogString& name,
const spi::LoggerFactoryPtr& factory)
{
- // Synchronize to prevent write conflicts. Read conflicts (in
- // getEffectiveLevel method) are possible only if variable
- // assignments are non-atomic.
- LoggerPtr logger;
-
synchronized sync(mutex);
LoggerMap::iterator it = loggers.find(name);
if (it != loggers.end())
{
- logger = it->second;
+ return it->second;
}
else
{
- logger = factory->makeNewLoggerInstance(name);
-
+ LoggerPtr logger(factory->makeNewLoggerInstance(name));
logger->setHierarchy(this);
loggers.insert(LoggerMap::value_type(name, logger));
@@ -188,10 +183,9 @@
}
updateParents(logger);
+ return logger;
}
-
- return logger;
}
LoggerList Hierarchy::getCurrentLoggers() const
@@ -284,8 +278,9 @@
}
-void Hierarchy::updateParents(LoggerPtr& logger)
+void Hierarchy::updateParents(LoggerPtr logger)
{
+ synchronized sync(mutex);
const LogString name(logger->getName());
int length = name.size();
bool parentFound = false;
@@ -331,7 +326,7 @@
}
}
-void Hierarchy::updateChildren(ProvisionNode& pn, LoggerPtr& logger)
+void Hierarchy::updateChildren(ProvisionNode& pn, LoggerPtr logger)
{
//tcout << _T("updateChildren called for ") << logger->name <<
std::endl;