You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by ca...@apache.org on 2006/01/23 18:50:47 UTC
svn commit: r371607 - in /logging/log4cxx/trunk:
include/log4cxx/helpers/charsetdecoder.h
include/log4cxx/helpers/charsetencoder.h
include/log4cxx/helpers/objectptr.h src/charsetdecoder.cpp
src/charsetencoder.cpp
Author: carnold
Date: Mon Jan 23 09:50:43 2006
New Revision: 371607
URL: http://svn.apache.org/viewcvs?rev=371607&view=rev
Log:
Bug LOGCXX-112: Default encoder crashes when called from static object destructor
Modified:
logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h
logging/log4cxx/trunk/include/log4cxx/helpers/charsetencoder.h
logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
logging/log4cxx/trunk/src/charsetdecoder.cpp
logging/log4cxx/trunk/src/charsetencoder.cpp
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h
URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h?rev=371607&r1=371606&r2=371607&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h Mon Jan 23 09:50:43 2006
@@ -91,7 +91,13 @@
* Creates a new decoder for the default charset.
*/
static CharsetDecoder* createDefaultDecoder();
- };
+#if LOG4CXX_HAS_WCHAR_T
+ /**
+ * Creates a new decoder for the default charset.
+ */
+ static CharsetDecoder* createWideDecoder();
+#endif
+ };
} // namespace helpers
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/charsetencoder.h
URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/charsetencoder.h?rev=371607&r1=371606&r2=371607&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/charsetencoder.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/charsetencoder.h Mon Jan 23 09:50:43 2006
@@ -135,7 +135,13 @@
CharsetEncoder& operator=(const CharsetEncoder&);
static CharsetEncoder* createDefaultEncoder();
- };
+#if LOG4CXX_HAS_WCHAR_T
+ /**
+ * Create encoder for wchar_t type.
+ */
+ static CharsetEncoder* createWideEncoder();
+#endif
+ };
} // namespace helpers
Modified: logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h
URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h?rev=371607&r1=371606&r2=371607&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/objectptr.h Mon Jan 23 09:50:43 2006
@@ -1,5 +1,5 @@
/*
- * Copyright 2003,2004 The Apache Software Foundation.
+ * Copyright 2003,2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -87,6 +87,7 @@
{
this->p->releaseRef();
}
+ this->p = 0;
}
// Operators
Modified: logging/log4cxx/trunk/src/charsetdecoder.cpp
URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/charsetdecoder.cpp?rev=371607&r1=371606&r2=371607&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/charsetdecoder.cpp (original)
+++ logging/log4cxx/trunk/src/charsetdecoder.cpp Mon Jan 23 09:50:43 2006
@@ -433,18 +433,39 @@
CharsetDecoderPtr CharsetDecoder::getDefaultDecoder() {
static CharsetDecoderPtr decoder(createDefaultDecoder());
+ //
+ // if invoked after static variable destruction
+ // (if logging is called in the destructor of a static object)
+ // then create a new decoder.
+ //
+ if (decoder == 0) {
+ return createDefaultDecoder();
+ }
return decoder;
}
#if LOG4CXX_HAS_WCHAR_T
-CharsetDecoderPtr CharsetDecoder::getWideDecoder() {
+CharsetDecoder* CharsetDecoder::createWideDecoder() {
#if LOG4CXX_LOGCHAR_IS_WCHAR
- static CharsetDecoderPtr decoder(new TrivialCharsetDecoder());
+ return new TrivialCharsetDecoder();
#elif defined(_WIN32) || defined(__STDC_ISO_10646__)
- static CharsetDecoderPtr decoder(new WideToUTF8CharsetDecoder());
+ return new WideToUTF8CharsetDecoder();
#else
- static CharsetDecoderPtr decoder(new APRCharsetDecoder("WCHAR_T"));
+ return new APRCharsetDecoder("WCHAR_T");
#endif
+}
+
+
+CharsetDecoderPtr CharsetDecoder::getWideDecoder() {
+ static CharsetDecoderPtr decoder(createWideDecoder());
+ //
+ // if invoked after static variable destruction
+ // (if logging is called in the destructor of a static object)
+ // then create a new decoder.
+ //
+ if (decoder == 0) {
+ return createWideDecoder();
+ }
return decoder;
}
#endif
Modified: logging/log4cxx/trunk/src/charsetencoder.cpp
URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/charsetencoder.cpp?rev=371607&r1=371606&r2=371607&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/charsetencoder.cpp (original)
+++ logging/log4cxx/trunk/src/charsetencoder.cpp Mon Jan 23 09:50:43 2006
@@ -464,6 +464,14 @@
CharsetEncoderPtr CharsetEncoder::getDefaultEncoder() {
static CharsetEncoderPtr encoder(createDefaultEncoder());
+ //
+ // if invoked after static variable destruction
+ // (if logging is called in the destructor of a static object)
+ // then create a new decoder.
+ //
+ if (encoder == 0) {
+ return createDefaultEncoder();
+ }
return encoder;
}
@@ -497,14 +505,27 @@
#if LOG4CXX_HAS_WCHAR_T
-CharsetEncoderPtr CharsetEncoder::getWideEncoder() {
+CharsetEncoder* CharsetEncoder::createWideEncoder() {
#if LOG4CXX_LOGCHAR_IS_WCHAR
- static CharsetEncoderPtr encoder(new TrivialCharsetEncoder());
+ return new TrivialCharsetEncoder();
#endif
#if LOG4CXX_LOGCHAR_IS_UTF8
- static CharsetEncoderPtr encoder(new WideCharsetEncoder());
+ return new WideCharsetEncoder();
#endif
- return encoder;
+}
+
+
+CharsetEncoderPtr CharsetEncoder::getWideEncoder() {
+ static CharsetEncoderPtr encoder(createWideEncoder());
+ //
+ // if invoked after static variable destruction
+ // (if logging is called in the destructor of a static object)
+ // then create a new decoder.
+ //
+ if (encoder == 0) {
+ return createWideEncoder();
+ }
+ return encoder;
}
#endif