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