Author: carnold
Date: Tue Jul 3 14:27:10 2007
New Revision: 552987
URL: http://svn.apache.org/viewvc?view=rev&rev=552987
Log:
LOGCXX-186: Synchronization changes unlikely related to observed bug
Modified:
logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h
logging/log4cxx/trunk/include/log4cxx/fileappender.h
logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
logging/log4cxx/trunk/include/log4cxx/hierarchy.h
logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h
logging/log4cxx/trunk/include/log4cxx/writerappender.h
logging/log4cxx/trunk/src/appenderskeleton.cpp
logging/log4cxx/trunk/src/asyncappender.cpp
logging/log4cxx/trunk/src/fileappender.cpp
logging/log4cxx/trunk/src/hierarchy.cpp
logging/log4cxx/trunk/src/logger.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/writerappender.cpp
Modified: logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/appenderskeleton.h Tue Jul 3
14:27:10 2007
@@ -67,7 +67,7 @@
/**
Is this appender closed?
*/
- volatile unsigned int closed;
+ bool closed;
log4cxx::helpers::Pool pool;
log4cxx::helpers::Mutex mutex;
Modified: logging/log4cxx/trunk/include/log4cxx/fileappender.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/fileappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/fileappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/fileappender.h Tue Jul 3 14:27:10
2007
@@ -61,8 +61,6 @@
How big should the IO buffer be? Default is 8K. */
int bufferSize;
- volatile unsigned int fileClosed;
-
public:
DECLARE_LOG4CXX_OBJECT(FileAppender)
BEGIN_LOG4CXX_CAST_MAP()
@@ -186,8 +184,7 @@
<p>Note: Actual opening of the file is made when
#activateOptions is called, not when the options are set.
*/
- inline void setAppend(bool fileAppend1)
- { this->fileAppend = fileAppend1; }
+ void setAppend(bool fileAppend1);
/**
The <b>BufferedIO</b> option takes a boolean value. It is set
to
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h Tue Jul 3
14:27:10 2007
@@ -28,7 +28,8 @@
class LOG4CXX_EXPORT ObjectPtrBase {
public:
static void checkNull(const int& null);
- static void* exchange(volatile void** destination, void* newValue);
+ static void* exchange(void** destination, void* newValue);
+ static void* unsynchronizedExchange(void** destination, void*
newValue);
};
@@ -37,32 +38,35 @@
{
public:
template<typename InterfacePtr> ObjectPtrT(const InterfacePtr& p1)
- : p(0)
{
+ ObjectPtrBase::exchange((void**) &p, 0);
cast(p1);
}
ObjectPtrT(const int& null) //throw(IllegalArgumentException)
- : p(0)
{
+ ObjectPtrBase::exchange((void**) &p, 0);
ObjectPtrBase::checkNull(null);
}
- ObjectPtrT() : p(0)
+ ObjectPtrT()
{
+ ObjectPtrBase::exchange((void**) &p, 0);
}
- ObjectPtrT(T * p1) : p(p1)
+ ObjectPtrT(T * p1)
{
+ ObjectPtrBase::exchange((void**) &p, p1);
if (this->p != 0)
{
this->p->addRef();
}
}
- ObjectPtrT(const ObjectPtrT& p1) : p(p1.p)
+ ObjectPtrT(const ObjectPtrT& p1)
{
+ ObjectPtrBase::exchange((void**) &p, p1.p);
if (this->p != 0)
{
this->p->addRef();
@@ -71,7 +75,7 @@
~ObjectPtrT()
{
- void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, 0);
+ void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
if (oldPtr != 0) {
((T*) oldPtr)->releaseRef();
}
@@ -89,7 +93,7 @@
if (newPtr != 0) {
newPtr->addRef();
}
- void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, newPtr);
+ void* oldPtr = ObjectPtrBase::exchange((void**) &p, newPtr);
if (oldPtr != 0) {
((T*) oldPtr)->releaseRef();
}
@@ -102,7 +106,7 @@
// throws IllegalArgumentException if null != 0
//
ObjectPtrBase::checkNull(null);
- void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, 0);
+ void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
if (oldPtr != 0) {
((T*) oldPtr)->releaseRef();
}
@@ -113,7 +117,7 @@
if (p1 != 0) {
p1->addRef();
}
- void* oldPtr = ObjectPtrBase::exchange((volatile void**)
&this->p, p1);
+ void* oldPtr = ObjectPtrBase::exchange((void**) &p, p1);
if (oldPtr != 0) {
((T*)oldPtr)->releaseRef();
}
@@ -143,6 +147,7 @@
private:
T * p;
};
+
}
}
Modified: logging/log4cxx/trunk/include/log4cxx/hierarchy.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/hierarchy.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/hierarchy.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/hierarchy.h Tue Jul 3 14:27:10 2007
@@ -66,7 +66,7 @@
private:
log4cxx::helpers::Pool pool;
log4cxx::helpers::Mutex mutex;
- volatile log4cxx_uint32_t configured;
+ bool configured;
spi::LoggerFactoryPtr defaultFactory;
spi::HierarchyEventListenerList listeners;
@@ -84,11 +84,6 @@
bool emittedNoAppenderWarning;
bool emittedNoResourceBundleWarning;
-
- /**
- Map synchronization
- */
- mutable apr_thread_mutex_t* mapCs;
public:
DECLARE_ABSTRACT_LOG4CXX_OBJECT(Hierarchy)
Modified: logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/net/telnetappender.h Tue Jul 3
14:27:10 2007
@@ -130,7 +130,7 @@
ConnectionList connections;
helpers::ServerSocket* serverSocket;
helpers::Thread sh;
- volatile unsigned int activeConnections;
+ int activeConnections;
static void* LOG4CXX_THREAD_FUNC
acceptConnections(helpers::log4cxx_thread_t* thread, void* data);
}; // class TelnetAppender
} // namespace net
Modified: logging/log4cxx/trunk/include/log4cxx/writerappender.h
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/include/log4cxx/writerappender.h?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/writerappender.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/writerappender.h Tue Jul 3 14:27:10
2007
@@ -100,8 +100,7 @@
be recorded on disk when the application exits. This is a high
price to pay even for a 20% performance gain.
*/
- void setImmediateFlush(bool value) { immediateFlush = value; }
-
+ void setImmediateFlush(bool value);
/**
Returns value of the <b>ImmediateFlush</b> option.
*/
@@ -174,7 +173,7 @@
<p><b>WARNING:</b> Logging to an unopened Writer will fail.
<p>
@param writer An already opened Writer. */
- void setWriter(log4cxx::helpers::WriterPtr& writer);
+ void setWriter(const log4cxx::helpers::WriterPtr& writer);
virtual bool requiresLayout() const;
Modified: logging/log4cxx/trunk/src/appenderskeleton.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/appenderskeleton.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/appenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/appenderskeleton.cpp Tue Jul 3 14:27:10 2007
@@ -37,10 +37,11 @@
errorHandler(new OnlyOnceErrorHandler()),
headFilter(),
tailFilter(),
- closed(0),
pool(),
mutex(pool)
{
+ synchronized sync(mutex);
+ closed = false;
}
AppenderSkeleton::AppenderSkeleton(const LayoutPtr& layout1)
@@ -50,10 +51,11 @@
errorHandler(new OnlyOnceErrorHandler()),
headFilter(),
tailFilter(),
- closed(0),
pool(),
mutex(pool)
{
+ synchronized sync(mutex);
+ closed = false;
}
void AppenderSkeleton::finalize()
@@ -70,6 +72,7 @@
void AppenderSkeleton::addFilter(const spi::FilterPtr& newFilter)
{
+ synchronized sync(mutex);
if(headFilter == 0)
{
headFilter = tailFilter = newFilter;
@@ -83,6 +86,7 @@
void AppenderSkeleton::clearFilters()
{
+ synchronized sync(mutex);
headFilter = tailFilter = 0;
}
@@ -146,6 +150,7 @@
void AppenderSkeleton::setThreshold(const LevelPtr& threshold1)
{
+ synchronized sync(mutex);
this->threshold = threshold1;
}
Modified: logging/log4cxx/trunk/src/asyncappender.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/asyncappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/asyncappender.cpp (original)
+++ logging/log4cxx/trunk/src/asyncappender.cpp Tue Jul 3 14:27:10 2007
@@ -109,7 +109,8 @@
void AsyncAppender::close()
{
- apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
+ bool wasClosed = closed;
+ closed = true;
if (!wasClosed) {
pending.broadcast();
thread.join();
Modified: logging/log4cxx/trunk/src/fileappender.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/fileappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/fileappender.cpp (original)
+++ logging/log4cxx/trunk/src/fileappender.cpp Tue Jul 3 14:27:10 2007
@@ -26,6 +26,7 @@
#include <log4cxx/helpers/outputstreamwriter.h>
#include <log4cxx/helpers/bufferedwriter.h>
#include <log4cxx/helpers/bytebuffer.h>
+#include <log4cxx/helpers/synchronized.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
@@ -34,34 +35,50 @@
IMPLEMENT_LOG4CXX_OBJECT(FileAppender)
-FileAppender::FileAppender()
-: fileAppend(true), fileName(), bufferedIO(false), bufferSize(8*1024),
- fileClosed(1)
-{
+FileAppender::FileAppender() {
+ synchronized sync(mutex);
+ fileAppend = true;
+ bufferedIO = false;
+ bufferSize = 8 * 1024;
}
FileAppender::FileAppender(const LayoutPtr& layout1, const LogString&
fileName1,
- bool append1, bool bufferedIO1, int bufferSize1)
-: WriterAppender(layout1), fileAppend(append1), fileName(fileName1),
bufferedIO(bufferedIO1), bufferSize(bufferSize1),
- fileClosed(1)
-{
+ bool append1, bool bufferedIO1, int bufferSize1)
+ : WriterAppender(layout1) {
+ {
+ synchronized sync(mutex);
+ fileAppend = append1;
+ fileName = fileName1;
+ bufferedIO = bufferedIO1;
+ bufferSize = bufferSize1;
+ }
Pool p;
activateOptions(p);
}
FileAppender::FileAppender(const LayoutPtr& layout1, const LogString&
fileName1,
bool append1)
-: WriterAppender(layout1), fileAppend(append1), fileName(fileName1),
bufferedIO(false), bufferSize(8*1024),
- fileClosed(1)
-{
+: WriterAppender(layout1) {
+ {
+ synchronized sync(mutex);
+ fileAppend = append1;
+ fileName = fileName1;
+ bufferedIO = false;
+ bufferSize = 8 * 1024;
+ }
Pool p;
activateOptions(p);
}
FileAppender::FileAppender(const LayoutPtr& layout1, const LogString&
fileName1)
-: WriterAppender(layout1), fileAppend(true), fileName(fileName1),
- bufferedIO(false), bufferSize(8*1024), fileClosed(1)
-{
+: WriterAppender(layout1) {
+ {
+ synchronized sync(mutex);
+ fileAppend = true;
+ fileName = fileName1;
+ bufferedIO = false;
+ bufferSize = 8 * 1024;
+ }
Pool p;
activateOptions(p);
}
@@ -71,8 +88,14 @@
finalize();
}
+void FileAppender::setAppend(bool fileAppend1) {
+ synchronized sync(mutex);
+ this->fileAppend = fileAppend1;
+}
+
void FileAppender::setFile(const LogString& file)
{
+ synchronized sync(mutex);
fileName = file;
}
@@ -80,6 +103,7 @@
void FileAppender::setBufferedIO(bool bufferedIO1)
{
+ synchronized sync(mutex);
this->bufferedIO = bufferedIO1;
if(bufferedIO1)
{
@@ -93,22 +117,27 @@
if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("FILE"),
LOG4CXX_STR("file"))
|| StringHelper::equalsIgnoreCase(option,
LOG4CXX_STR("FILENAME"), LOG4CXX_STR("filename")))
{
+ synchronized sync(mutex);
fileName = stripDuplicateBackslashes(value);
}
else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("APPEND"),
LOG4CXX_STR("append")))
{
+ synchronized sync(mutex);
fileAppend = OptionConverter::toBoolean(value, true);
}
else if (StringHelper::equalsIgnoreCase(option,
LOG4CXX_STR("BUFFEREDIO"), LOG4CXX_STR("bufferedio")))
{
+ synchronized sync(mutex);
bufferedIO = OptionConverter::toBoolean(value, true);
}
else if (StringHelper::equalsIgnoreCase(option,
LOG4CXX_STR("IMMEDIATEFLUSH"), LOG4CXX_STR("immediateflush")))
{
+ synchronized sync(mutex);
bufferedIO = !OptionConverter::toBoolean(value, false);
}
else if (StringHelper::equalsIgnoreCase(option,
LOG4CXX_STR("BUFFERSIZE"), LOG4CXX_STR("buffersize")))
{
+ synchronized sync(mutex);
bufferSize = OptionConverter::toFileSize(value, 8*1024);
}
else
@@ -119,6 +148,7 @@
void FileAppender::activateOptions(Pool& p)
{
+ synchronized sync(mutex);
int errors = 0;
if (!fileName.empty()) {
try {
Modified: logging/log4cxx/trunk/src/hierarchy.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/hierarchy.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/hierarchy.cpp (original)
+++ logging/log4cxx/trunk/src/hierarchy.cpp Tue Jul 3 14:27:10 2007
@@ -43,13 +43,17 @@
Hierarchy::Hierarchy() :
pool(),
-mutex(pool), configured(false),
-thresholdInt(Level::ALL_INT), threshold(Level::getAll()),
-emittedNoAppenderWarning(false), emittedNoResourceBundleWarning(false)
+mutex(pool)
{
+ synchronized sync(mutex);
root = new RootCategory(pool, Level::getDebug());
root->setHierarchy(this);
defaultFactory = new DefaultCategoryFactory();
+ emittedNoAppenderWarning = false;
+ configured = false;
+ thresholdInt = Level::ALL_INT;
+ threshold = Level::getAll();
+ emittedNoResourceBundleWarning = false;
}
Hierarchy::~Hierarchy()
@@ -58,6 +62,7 @@
void Hierarchy::addHierarchyEventListener(const
spi::HierarchyEventListenerPtr& listener)
{
+ synchronized sync(mutex);
if (std::find(listeners.begin(), listeners.end(), listener) !=
listeners.end())
{
LogLog::warn(LOG4CXX_STR("Ignoring attempt to add an existent
listener."));
@@ -76,13 +81,19 @@
void Hierarchy::emitNoAppenderWarning(const LoggerPtr& logger)
{
+ bool emitWarning = false;
+ {
+ synchronized sync(mutex);
+ emitWarning = !emittedNoAppenderWarning;
+ emittedNoAppenderWarning = true;
+ }
+
// No appender in hierarchy, warn user only once.
- if(!this->emittedNoAppenderWarning)
+ if(emitWarning)
{
LogLog::warn(((LogString) LOG4CXX_STR("No appender could be
found for logger ("))
+ logger->getName() + LOG4CXX_STR(")."));
LogLog::warn(LOG4CXX_STR("Please initialize the log4cxx system
properly."));
- this->emittedNoAppenderWarning = true;
}
}
@@ -106,8 +117,9 @@
{
if (l != 0)
{
- thresholdInt = l->toInt();
- threshold = l;
+ synchronized sync(mutex);
+ thresholdInt = l->toInt();
+ threshold = l;
if (thresholdInt != Level::ALL_INT) {
setConfigured(true);
}
@@ -130,11 +142,17 @@
void Hierarchy::fireAddAppenderEvent(const LoggerPtr& logger, const
AppenderPtr& appender)
{
- setConfigured(true);
- HierarchyEventListenerList::iterator it, itEnd = listeners.end();
+ setConfigured(true);
+ HierarchyEventListenerList clonedList;
+ {
+ synchronized sync(mutex);
+ clonedList = listeners;
+ }
+
+ HierarchyEventListenerList::iterator it, itEnd = clonedList.end();
HierarchyEventListenerPtr listener;
- for(it = listeners.begin(); it != itEnd; it++)
+ for(it = clonedList.begin(); it != itEnd; it++)
{
listener = *it;
listener->addAppenderEvent(logger, appender);
@@ -144,10 +162,15 @@
void Hierarchy::fireRemoveAppenderEvent(const LoggerPtr& logger, const
AppenderPtr& appender)
{
- HierarchyEventListenerList::iterator it, itEnd = listeners.end();
+ HierarchyEventListenerList clonedList;
+ {
+ synchronized sync(mutex);
+ clonedList = listeners;
+ }
+ HierarchyEventListenerList::iterator it, itEnd = clonedList.end();
HierarchyEventListenerPtr listener;
- for(it = listeners.begin(); it != itEnd; it++)
+ for(it = clonedList.begin(); it != itEnd; it++)
{
listener = *it;
listener->removeAppenderEvent(logger, appender);
@@ -217,13 +240,12 @@
bool Hierarchy::isDisabled(int level) const
{
- //
- // if repository hasn't been configured,
- // do default configuration
- //
- if (apr_atomic_xchg32(const_cast<volatile unsigned int*>(&configured), 1)
== 0) {
+ if(!configured) {
+ synchronized sync(mutex);
+ if (!configured) {
DefaultConfigurator::configure(
const_cast<Hierarchy*>(this));
+ }
}
return thresholdInt > level;
@@ -354,9 +376,10 @@
}
void Hierarchy::setConfigured(bool newValue) {
- apr_atomic_set32(&configured, newValue ? 1 : 0);
+ synchronized sync(mutex);
+ configured = newValue;
}
bool Hierarchy::isConfigured() {
- return configured ? true : false;
+ return configured;
}
Modified: logging/log4cxx/trunk/src/logger.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/logger.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/logger.cpp (original)
+++ logging/log4cxx/trunk/src/logger.cpp Tue Jul 3 14:27:10 2007
@@ -39,9 +39,12 @@
IMPLEMENT_LOG4CXX_OBJECT(Logger)
Logger::Logger(Pool& pool, const LogString& name1)
-: name(name1), level(), parent(), resourceBundle(),
-repository(0), aai(), additive(true), mutex(pool)
+: name(), level(), parent(), resourceBundle(),
+repository(), aai(), mutex(pool)
{
+ synchronized sync(mutex);
+ name = name1;
+ additive = true;
}
Logger::~Logger()
@@ -60,9 +63,9 @@
aai = new AppenderAttachableImpl();
}
aai->addAppender(newAppender);
- if (repository != 0) {
+ if (repository != 0) {
repository->fireAddAppenderEvent(this, newAppender);
- }
+ }
}
@@ -508,6 +511,7 @@
void Logger::setAdditivity(bool additive1)
{
+ synchronized sync(mutex);
this->additive = additive1;
}
Modified: logging/log4cxx/trunk/src/objectptr.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/objectptr.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/objectptr.cpp (original)
+++ logging/log4cxx/trunk/src/objectptr.cpp Tue Jul 3 14:27:10 2007
@@ -18,19 +18,29 @@
#include <log4cxx/logstring.h>
#include <log4cxx/helpers/objectptr.h>
#include <log4cxx/helpers/exception.h>
+#include <log4cxx/helpers/mutex.h>
+#include <log4cxx/helpers/aprinitializer.h>
+#include <log4cxx/helpers/synchronized.h>
#include <apr_atomic.h>
using namespace log4cxx::helpers;
void ObjectPtrBase::checkNull(const int& null) {
- if (null != 0)
- {
-
- throw IllegalArgumentException("Attempt to set pointer to a
non-zero numeric value.");
- }
+ if (null != 0) {
+ 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);
+void* ObjectPtrBase::exchange(void** destination, void* newValue) {
+ static Mutex mutex(APRInitializer::getRootPool());
+ synchronized sync(mutex);
+ void* oldValue = *destination;
+ *destination = newValue;
+ return oldValue;
}
+void* ObjectPtrBase::unsynchronizedExchange(void** destination, void*
newValue) {
+ void* oldValue = *destination;
+ *destination = newValue;
+ return oldValue;
+}
Modified: logging/log4cxx/trunk/src/socketappenderskeleton.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/socketappenderskeleton.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/socketappenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/socketappenderskeleton.cpp Tue Jul 3 14:27:10
2007
@@ -139,9 +139,10 @@
void SocketAppenderSkeleton::close()
{
- apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
- if (wasClosed) return;
- cleanUp();
+ synchronized sync(mutex);
+ if (closed) return;
+ closed = true;
+ cleanUp();
}
void SocketAppenderSkeleton::cleanUp()
@@ -207,7 +208,7 @@
void* APR_THREAD_FUNC SocketAppenderSkeleton::monitor(log4cxx_thread_t* /*
thread */, void* data) {
SocketAppenderSkeleton* socketAppender = (SocketAppenderSkeleton*)
data;
SocketPtr socket;
- apr_uint32_t isClosed = apr_atomic_read32(&socketAppender->closed);
+ bool isClosed = socketAppender->closed;
while(!isClosed)
{
try
@@ -241,7 +242,7 @@
+ LOG4CXX_STR(". Exception is ")
+ exmsg);
}
- isClosed = apr_atomic_read32(&socketAppender->closed);
+ isClosed = socketAppender->closed;
}
LogLog::debug(LOG4CXX_STR("Exiting Connector.run() method."));
Modified: logging/log4cxx/trunk/src/sockethubappender.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/sockethubappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/sockethubappender.cpp (original)
+++ logging/log4cxx/trunk/src/sockethubappender.cpp Tue Jul 3 14:27:10 2007
@@ -79,11 +79,16 @@
void SocketHubAppender::close()
{
- apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
- if (wasClosed) return;
+ {
+ synchronized sync(mutex);
+ if (closed) {
+ return;
+ }
+ closed = true;
+ }
LogLog::debug(LOG4CXX_STR("closing SocketHubAppender ") + getName());
- //
+ //
// wait until the server thread completes
//
thread.join();
@@ -168,7 +173,7 @@
return NULL;
}
- apr_uint32_t stopRunning = apr_atomic_read32(&pThis->closed);
+ bool stopRunning = pThis->closed;
while (!stopRunning)
{
SocketPtr socket;
@@ -183,7 +188,7 @@
catch (SocketException& e)
{
LogLog::error(LOG4CXX_STR("exception accepting socket,
shutting down server socket."), e);
- stopRunning = 1;
+ stopRunning = true;
}
catch (IOException& e)
{
Modified: logging/log4cxx/trunk/src/telnetappender.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/telnetappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/telnetappender.cpp (original)
+++ logging/log4cxx/trunk/src/telnetappender.cpp Tue Jul 3 14:27:10 2007
@@ -41,8 +41,10 @@
TelnetAppender::TelnetAppender()
: port(DEFAULT_PORT), connections(MAX_CONNECTIONS),
- serverSocket(NULL), sh(), activeConnections(0)
+ serverSocket(NULL), sh()
{
+ synchronized sync(mutex);
+ activeConnections = 0;
}
TelnetAppender::~TelnetAppender()
@@ -74,10 +76,9 @@
void TelnetAppender::close()
{
- apr_uint32_t wasClosed = apr_atomic_xchg32(&closed, 1);
- if (wasClosed) return;
-
synchronized sync(mutex);
+ if (closed) return;
+ closed = true;
sh.stop();
SocketPtr nullSocket;
@@ -111,7 +112,7 @@
void TelnetAppender::append(const spi::LoggingEventPtr& event, Pool& /* p */)
{
- apr_uint32_t count = apr_atomic_read32(&activeConnections);
+ int count = activeConnections;
if (count > 0) {
LogString os;
@@ -135,7 +136,7 @@
// The client has closed the
connection, remove it from our list:
iter->first = nullSocket;
iter->second = nullStream;
- apr_atomic_dec32(&activeConnections);
+ activeConnections--;
}
}
}
@@ -152,7 +153,7 @@
{
SocketPtr newClient = pThis->serverSocket->accept();
SocketOutputStreamPtr os = newClient->getOutputStream();
- apr_uint32_t done = apr_atomic_read32(&pThis->closed);
+ bool done = pThis->closed;
if (done) {
os->writeRaw(LOG4CXX_STR("Log closed.\r\n"));
os->flush();
@@ -160,7 +161,7 @@
return NULL;
}
- apr_uint32_t count =
apr_atomic_read32(&pThis->activeConnections);
+ int count = pThis->activeConnections;
if (count >= pThis->connections.size()) {
os->writeRaw(LOG4CXX_STR("Too many connections.\r\n"));
os->flush();
@@ -176,7 +177,7 @@
if (iter->first == NULL) {
iter->first = newClient;
iter->second = os;
-
apr_atomic_inc32(&pThis->activeConnections);
+ pThis->activeConnections++;
break;
}
}
Modified: logging/log4cxx/trunk/src/writerappender.cpp
URL:
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/writerappender.cpp?view=diff&rev=552987&r1=552986&r2=552987
==============================================================================
--- logging/log4cxx/trunk/src/writerappender.cpp (original)
+++ logging/log4cxx/trunk/src/writerappender.cpp Tue Jul 3 14:27:10 2007
@@ -27,19 +27,24 @@
IMPLEMENT_LOG4CXX_OBJECT(WriterAppender)
-WriterAppender::WriterAppender()
-: immediateFlush(true) {
+WriterAppender::WriterAppender() {
+ synchronized sync(mutex);
+ immediateFlush = true;
}
WriterAppender::WriterAppender(const LayoutPtr& layout1,
log4cxx::helpers::WriterPtr& writer1)
- : AppenderSkeleton(layout1), immediateFlush(true), writer(writer1) {
+ : AppenderSkeleton(layout1), writer(writer1) {
Pool p;
+ synchronized sync(mutex);
+ immediateFlush = true;
activateOptions(p);
}
WriterAppender::WriterAppender(const LayoutPtr& layout1)
- : AppenderSkeleton(layout1), immediateFlush(true) {
+ : AppenderSkeleton(layout1) {
+ synchronized sync(mutex);
+ immediateFlush = true;
}
@@ -198,9 +203,12 @@
{
LogString msg;
layout->format(msg, event, p);
- writer->write(msg, p);
- if (immediateFlush) {
+ {
+ synchronized sync(mutex);
+ writer->write(msg, p);
+ if (immediateFlush) {
writer->flush(p);
+ }
}
}
@@ -210,6 +218,7 @@
if (layout != NULL) {
LogString foot;
layout->appendFooter(foot, p);
+ synchronized sync(mutex);
writer->write(foot, p);
}
}
@@ -219,12 +228,14 @@
if(layout != NULL) {
LogString header;
layout->appendHeader(header, p);
+ synchronized sync(mutex);
writer->write(header, p);
}
}
-void WriterAppender::setWriter(WriterPtr& newWriter) {
+void WriterAppender::setWriter(const WriterPtr& newWriter) {
+ synchronized sync(mutex);
writer = newWriter;
}
@@ -239,4 +250,10 @@
} else {
AppenderSkeleton::setOption(option, value);
}
+}
+
+
+void WriterAppender::setImmediateFlush(bool value) {
+ synchronized sync(mutex);
+ immediateFlush = value;
}