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 2007/10/26 00:32:52 UTC

svn commit: r588376 - in /logging/log4cxx/trunk/src/main: cpp/fileoutputstream.cpp cpp/thread.cpp cpp/threadlocal.cpp include/log4cxx/helpers/objectptr.h

Author: carnold
Date: Thu Oct 25 15:32:44 2007
New Revision: 588376

URL: http://svn.apache.org/viewvc?rev=588376&view=rev
Log:
LOGCXX-183: Compiler warning: dereferencing type-punned pointer will break strict aliasing rules

Modified:
    logging/log4cxx/trunk/src/main/cpp/fileoutputstream.cpp
    logging/log4cxx/trunk/src/main/cpp/thread.cpp
    logging/log4cxx/trunk/src/main/cpp/threadlocal.cpp
    logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectptr.h

Modified: logging/log4cxx/trunk/src/main/cpp/fileoutputstream.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/fileoutputstream.cpp?rev=588376&r1=588375&r2=588376&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/fileoutputstream.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/fileoutputstream.cpp Thu Oct 25 15:32:44 2007
@@ -38,7 +38,8 @@
         flags |= APR_TRUNCATE;
     }
     LOG4CXX_ENCODE_CHAR(fn, filename);
-    log4cxx_status_t stat = apr_file_open((apr_file_t**) &fileptr,
+    apr_file_t** pfileptr = reinterpret_cast<apr_file_t**>(&fileptr);
+    log4cxx_status_t stat = apr_file_open(pfileptr,
         fn.c_str(), flags, perm, (apr_pool_t*) pool.getAPRPool());
     if (stat != APR_SUCCESS) {
       throw IOException(stat);

Modified: logging/log4cxx/trunk/src/main/cpp/thread.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/thread.cpp?rev=588376&r1=588375&r2=588376&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/thread.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/thread.cpp Thu Oct 25 15:32:44 2007
@@ -73,7 +73,8 @@
         
         //   create LaunchPackage on the thread's memory pool
         LaunchPackage* package = new(p) LaunchPackage(this, start, data);
-        stat = apr_thread_create((apr_thread_t**) &thread, attrs,
+        apr_thread_t** pthread = (apr_thread_t**) &thread;
+        stat = apr_thread_create(pthread, attrs,
             (apr_thread_start_t) launcher, package, (apr_pool_t*) p.getAPRPool());
         if (stat != APR_SUCCESS) {
                 throw ThreadException(stat);

Modified: logging/log4cxx/trunk/src/main/cpp/threadlocal.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/threadlocal.cpp?rev=588376&r1=588375&r2=588376&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/threadlocal.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/threadlocal.cpp Thu Oct 25 15:32:44 2007
@@ -23,11 +23,13 @@
 using namespace log4cxx;
 
 ThreadLocal::ThreadLocal() {
-    apr_status_t stat = apr_pool_create((apr_pool_t**) &pool, 0);
+    apr_pool_t** ppool = reinterpret_cast<apr_pool_t**>(&pool);
+    apr_status_t stat = apr_pool_create(ppool, 0);
     if (stat != APR_SUCCESS) {
         throw RuntimeException(stat);
     }
-    stat = apr_threadkey_private_create((apr_threadkey_t**) &key, 0, (apr_pool_t*) pool);
+    apr_threadkey_t** pkey = reinterpret_cast<apr_threadkey_t**>(&key);
+    stat = apr_threadkey_private_create(pkey, 0, (apr_pool_t*) pool);
     if (stat != APR_SUCCESS) {
          throw RuntimeException(stat);
     }

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectptr.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectptr.h?rev=588376&r1=588375&r2=588376&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectptr.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectptr.h Thu Oct 25 15:32:44 2007
@@ -21,18 +21,18 @@
 #include <log4cxx/log4cxx.h>
 
 //
-// Note:
-// The LOG4CXX_HELGRIND conditional sections are due to conflicting
-// demands of two diagnostic tools.  The -Weffc++ option for the GCC
-// compiler wants the wrapped pointer to be initialized in
-// the member initialization list.
-// However, the Helgrind race condition tool for Valgrind will report
-// that the wrapped pointer written outside of a synchronization
-// block.  The member initialization approach is more efficient
-// and should be safe since existing usage patterns should prevent
-// the pointer to be available to other threads until after 
-// construction is complete.
+//   Helgrind (race detection tool for Valgrind) will complain if pointer
+//   is not initialized in an atomic operation.  Static analysis tools
+//   (gcc's -Weffc++, for example) will complain if pointer is not initialized
+//   in member initialization list.  The use of a macro allows quick
+//   switching between the initialization styles.
 //
+#if LOG4CXX_HELGRIND
+#define _LOG4CXX_OBJECTPTR_INIT(x) { T** pp = &p; ObjectPtrBase::exchange((void**) pp, x); 
+#else
+#define _LOG4CXX_OBJECTPTR_INIT(x) : p(x) {
+#endif
+
 namespace log4cxx
 {
     namespace helpers
@@ -50,55 +50,30 @@
         {
         public:
          template<typename InterfacePtr> ObjectPtrT(const InterfacePtr& p1)
-#if LOG4CXX_HELGRIND
-         {
-             ObjectPtrBase::exchange((void**) &p, 0);
-#else
-         : p(0) {
-#endif
+            _LOG4CXX_OBJECTPTR_INIT(0)             
              cast(p1);
          }
 
 
-         ObjectPtrT(const int& null) //throw(IllegalArgumentException)
-#if LOG4CXX_HELGRIND
-         {
-                ObjectPtrBase::exchange((void**) &p, 0);
-#else
-         : p(0) {
-#endif
+         ObjectPtrT(const int& null) 
+                _LOG4CXX_OBJECTPTR_INIT(0)
                 ObjectPtrBase::checkNull(null);
          }
 
          ObjectPtrT()
-#if LOG4CXX_HELGRIND
-         {
-                ObjectPtrBase::exchange((void**) &p, 0);
-#else
-         : p(0) {
-#endif
+                _LOG4CXX_OBJECTPTR_INIT(0)
          }
 
          ObjectPtrT(T * p1)
-#if LOG4CXX_HELGRIND
-            {
-                ObjectPtrBase::exchange((void**) &p, p1);
-#else
-         : p(p1) {
-#endif
+                _LOG4CXX_OBJECTPTR_INIT(p1)
                 if (this->p != 0)
                 {
                     this->p->addRef();
                 }
             }
 
-            ObjectPtrT(const ObjectPtrT& p1)
-#if LOG4CXX_HELGRIND
-            {
-                ObjectPtrBase::exchange((void**) &p, p1.p);
-#else
-            : p(p1.p) {
-#endif
+         ObjectPtrT(const ObjectPtrT& p1)
+                _LOG4CXX_OBJECTPTR_INIT(p1.p)
                 if (this->p != 0)
                 {
                     this->p->addRef();
@@ -107,9 +82,8 @@
 
             ~ObjectPtrT()
             {
-              void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
-              if (oldPtr != 0) {
-                  ((T*) oldPtr)->releaseRef();
+              if (p != 0) {
+                  p->releaseRef();
               }
             }
 
@@ -125,7 +99,8 @@
              if (newPtr != 0) {
                  newPtr->addRef();
              }
-             void* oldPtr = ObjectPtrBase::exchange((void**) &p, newPtr);
+             T** pp = &p;
+             void* oldPtr = ObjectPtrBase::exchange((void**) pp, newPtr);
              if (oldPtr != 0) {
                  ((T*) oldPtr)->releaseRef();
              }
@@ -138,7 +113,8 @@
                 //   throws IllegalArgumentException if null != 0
                 //
                 ObjectPtrBase::checkNull(null);
-                void* oldPtr = ObjectPtrBase::exchange((void**) &p, 0);
+                T** pp = &p;
+                void* oldPtr = ObjectPtrBase::exchange((void**) pp, 0);
                 if (oldPtr != 0) {
                    ((T*) oldPtr)->releaseRef();
                 }
@@ -149,7 +125,8 @@
               if (p1 != 0) {
                 p1->addRef();
               }
-              void* oldPtr = ObjectPtrBase::exchange((void**) &p, p1);
+              T** pp = &p;
+              void* oldPtr = ObjectPtrBase::exchange((void**) pp, p1);
               if (oldPtr != 0) {
                  ((T*)oldPtr)->releaseRef();
               }