You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by Tanguy Le Gall <ta...@airfrance.fr> on 2007/11/14 12:28:34 UTC

SIGSEGV in apr_atomic_xchg32

Hello,

I've been trying out log4cxx on Solaris. I'm using the Sun Compiler CC 
version 5.5 on a Solaris 5.8 platform.
I've wrote a rather simple class which encapsulate the log4cxx, however I 
systematically get a SIGSEGV in the APr function apr_atomic_xchg32 as soon 
as I instanciate an object fro my logging class.
The only way I got it to work is by creating a loggin object in the main 
of my program.

I've seen a similar problem posted on Aug 21, 2007 by Brian under the 
subject "multithread issue". It seems like the problem comes from the 
initialiation of the APR.
Is this issue going to be fixed? Is there anyother way to initialize it 
rather than calling the LoggerPtr constructeur?

Tanguy 

Re: SIGSEGV in apr_atomic_xchg32

Posted by Curt Arnold <ca...@apache.org>.
On Nov 14, 2007, at 5:28 AM, Tanguy Le Gall wrote:

>
> Hello,
>
> I've been trying out log4cxx on Solaris. I'm using the Sun Compiler  
> CC version 5.5 on a Solaris 5.8 platform.
> I've wrote a rather simple class which encapsulate the log4cxx,  
> however I systematically get a SIGSEGV in the APr function  
> apr_atomic_xchg32 as soon as I instanciate an object fro my logging  
> class.
> The only way I got it to work is by creating a loggin object in the  
> main of my program.
>
> I've seen a similar problem posted on Aug 21, 2007 by Brian under  
> the subject "multithread issue". It seems like the problem comes  
> from the initialiation of the APR.
> Is this issue going to be fixed? Is there anyother way to  
> initialize it rather than calling the LoggerPtr constructeur?
>
> Tanguy

Are you using the current SVN HEAD?

There have been some minor changes that should delay the first use of  
apr_atomic_xchg32 until the first pointer assignment at which time  
you'd expect that APR would have been initialized.  That is unless  
you were doing something like:

LoggerPtr logger = 0;

which does an unnecessary assignment and one that would not have  
triggered an APR initialization.  Any log4cxx object creation should  
have triggered APR initialization, so an assignment like:

LoggerPtr logger = Logger::getLogger("foo");

should be safe, though

LoggerPtr logger(Logger::getLogger("foo"));

would be better and would not need to call apr_atomic_xchg32.

I'd like to avoid forcing a check of APR initialization on every  
pointer assignment, particularly since on the most common platforms  
apr_atomic_xchg32 does not require APR initialization.

log4cxx 0.9.7 did not attempt to do an atomic exchange on pointer  
assignment, so dropping back to an non-atomic exchange is not likely  
to create problems.  You can do that by tweaking with the definition  
of ObjectPtrBase::exchange in src/cpp/main/objectptr.c


Index: src/main/cpp/objectptr.cpp
===================================================================
--- src/main/cpp/objectptr.cpp  (revision 594294)
+++ src/main/cpp/objectptr.cpp  (working copy)
@@ -33,14 +33,7 @@
}
void* ObjectPtrBase::exchange(void** destination, void* newValue) {
-#if APR_SIZEOF_VOIDP == 4
-   return (void*) apr_atomic_xchg32((volatile apr_uint32_t*)  
destination,
-                          (apr_uint32_t) newValue);
-#else
-   static Mutex mutex(APRInitializer::getRootPool());
-   synchronized sync(mutex);
     void* oldValue = *destination;
     *destination = newValue;
     return oldValue;
-#endif
}

I expect to be in the function before release.  I'd like to call  
InterlockedExchangePtr for Win64 and skip the synchronization for  
other 64-bit OS's.  The SVN HEAD of APR contains an  
apr_atomic_xchgptr, so ideally configure would detect whether it was  
present and use that if available, but don't see that happening.