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();
}