Author: tschoening
Date: Mon Feb 10 14:17:26 2014
New Revision: 1566630

URL: http://svn.apache.org/r1566630
Log:
LOGCXX-337: Suggested fix for socketappender not reconnecting multiple times

Modified:
    incubator/log4cxx/trunk/src/changes/changes.xml
    incubator/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp
    incubator/log4cxx/trunk/src/main/cpp/threadcxx.cpp

Modified: incubator/log4cxx/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/changes/changes.xml?rev=1566630&r1=1566629&r2=1566630&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/changes/changes.xml (original)
+++ incubator/log4cxx/trunk/src/changes/changes.xml Mon Feb 10 14:17:26 2014
@@ -59,6 +59,7 @@
                        <action issue="LOGCXX-319" type="fix">Please make sure 
that the LOG4CXX_* macro's can be used as ordinary statements.</action>
                        <action issue="LOGCXX-331" 
type="fix">DailyRollingFileAppender should roll if program doesn't run at 
rolling time</action>
                        <action issue="LOGCXX-336" type="fix">Test compilation 
fails: Overloading ambiguity</action>
+                       <action issue="LOGCXX-337" type="fix">Suggested fix for 
socketappender not reconnecting multiple times</action>
                        <action issue="LOGCXX-340" 
type="fix">Transcoder::encodeCharsetName bungles encoding</action>
                        <action issue="LOGCXX-351" type="fix">Download page 
does not have link to KEYS file</action>
                        <action issue="LOGCXX-353" type="fix">When a client 
disconnects the SocketHubAppender crashes on the next log message</action>

Modified: incubator/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp?rev=1566630&r1=1566629&r2=1566630&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp Mon Feb 10 
14:17:26 2014
@@ -28,7 +28,6 @@
 #include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/helpers/bytearrayoutputstream.h>
 
-
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 using namespace log4cxx::net;
@@ -135,8 +134,13 @@ void SocketAppenderSkeleton::setOption(c
 void SocketAppenderSkeleton::fireConnector()
 {
         synchronized sync(mutex);
-        if (!thread.isActive()) {
-                thread.run(monitor, this);
+        if ( !thread.isAlive() ) {
+             LogLog::debug(LOG4CXX_STR("Connector thread not alive: starting 
monitor."));
+             try {
+                  thread.run(monitor, this);
+             } catch( ThreadException& te ) {
+                  LogLog::error(LOG4CXX_STR("Monitor not started: "), te);
+             }
         }
 }
 

Modified: incubator/log4cxx/trunk/src/main/cpp/threadcxx.cpp
URL: 
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/threadcxx.cpp?rev=1566630&r1=1566629&r2=1566630&view=diff
==============================================================================
--- incubator/log4cxx/trunk/src/main/cpp/threadcxx.cpp (original)
+++ incubator/log4cxx/trunk/src/main/cpp/threadcxx.cpp Mon Feb 10 14:17:26 2014
@@ -149,6 +149,11 @@ Thread::~Thread() {
 
 void Thread::run(Runnable start, void* data) {
 #if APR_HAS_THREADS
+        // Try to join first if previous instance did exit
+        if ( isActive() && !isAlive() ) {
+             join();
+        }
+        // now we're ready to create the thread again
         //
         //    if attempting a second run method on the same Thread object
         //         throw an exception
@@ -179,19 +184,24 @@ void Thread::run(Runnable start, void* d
         if (stat != APR_SUCCESS) {
                 throw ThreadException(stat);
         }
+       // we need to set alive here already, since we use isAlive() to check
+       // if run() has been called in a thread-safe way.
+       apr_atomic_set32(&alive, 0xFFFFFFFF);
 #else
         throw ThreadException(LOG4CXX_STR("APR_HAS_THREADS is not true"));
 #endif
+    LaunchPackage* package = (LaunchPackage*) data;
+    ThreadLocal& tls = getThreadLocal();
+    tls.set(package->getThread());
+    {
+      (package->getRunnable())(thread, package->getData());
+      package->getThread()->ending();
+    }
+    apr_thread_exit(thread, 0); // this function never returns !
+    return 0;
 }
+#endif
 
-   
-
-
-void Thread::join() {
-#if APR_HAS_THREADS
-        if (thread != NULL) {
-                apr_status_t startStat;
-                apr_status_t stat = apr_thread_join(&startStat, thread);
                 thread = NULL;
                 if (stat != APR_SUCCESS) {
                         throw ThreadException(stat);


Reply via email to