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 2008/03/12 22:51:42 UTC

svn commit: r636527 - in /logging/log4cxx/trunk/src: changes/ main/cpp/ main/include/log4cxx/helpers/ main/include/log4cxx/net/ test/cpp/net/

Author: carnold
Date: Wed Mar 12 14:51:39 2008
New Revision: 636527

URL: http://svn.apache.org/viewvc?rev=636527&view=rev
Log:
LOGCXX-246: Config refresh hangs a client application that uses TelnetAppender

Modified:
    logging/log4cxx/trunk/src/changes/changes.xml
    logging/log4cxx/trunk/src/main/cpp/filewatchdog.cpp
    logging/log4cxx/trunk/src/main/cpp/telnetappender.cpp
    logging/log4cxx/trunk/src/main/cpp/threadcxx.cpp
    logging/log4cxx/trunk/src/main/include/log4cxx/helpers/thread.h
    logging/log4cxx/trunk/src/main/include/log4cxx/net/telnetappender.h
    logging/log4cxx/trunk/src/test/cpp/net/telnetappendertestcase.cpp

Modified: logging/log4cxx/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/changes/changes.xml?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/changes/changes.xml (original)
+++ logging/log4cxx/trunk/src/changes/changes.xml Wed Mar 12 14:51:39 2008
@@ -216,6 +216,7 @@
 <action issue="LOGCXX-241">Non-ascii named files have names mangled</action>
 <action issue="LOGCXX-242">Eliminate log4cxx proxies for APR types</action>
 <action issue="LOGCXX-243">Problem Compile in Doxy</action>
+<action issue="LOGCXX-246">Config refresh hangs a client application that uses TelnetAppender</action>
 <action issue="LOGCXX-247">MSVC project has wrong additional include directories</action>
 <action issue="LOGCXX-248">ODBCAppender has unicode issues</action>
 </release>

Modified: logging/log4cxx/trunk/src/main/cpp/filewatchdog.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/filewatchdog.cpp?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/filewatchdog.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/filewatchdog.cpp Wed Mar 12 14:51:39 2008
@@ -38,7 +38,8 @@
 }
 
 FileWatchdog::~FileWatchdog() {
-   thread.stop();
+   apr_atomic_set32(&interrupted, 0xFFFF);
+   thread.join();
 }
 
 void FileWatchdog::checkAndConfigure()
@@ -73,8 +74,11 @@
     while(!interrupted)
    {
       apr_sleep(APR_INT64_C(1000) * pThis->delay);
-      pThis->checkAndConfigure();
       interrupted = apr_atomic_read32(&pThis->interrupted);
+      if (!interrupted) {
+        pThis->checkAndConfigure();
+        interrupted = apr_atomic_read32(&pThis->interrupted);
+      }
     }
    return NULL;
 }

Modified: logging/log4cxx/trunk/src/main/cpp/telnetappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/telnetappender.cpp?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/telnetappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/telnetappender.cpp Wed Mar 12 14:51:39 2008
@@ -98,7 +98,6 @@
         synchronized sync(mutex);
         if (closed) return;
         closed = true;
-        sh.stop();
 
         SocketPtr nullSocket;
         for(ConnectionList::iterator iter = connections.begin();
@@ -116,6 +115,8 @@
                 } catch(Exception&) {
                 }
         }
+        
+        sh.join();
 
         activeConnections = 0;
 }
@@ -228,7 +229,11 @@
                         pThis->writeStatus(newClient, oss, p);
                 }
         } catch(Exception& e) {
-                LogLog::error(LOG4CXX_STR("Encountered error while in SocketHandler loop."), e);
+                if (!pThis->closed) {
+                    LogLog::error(LOG4CXX_STR("Encountered error while in SocketHandler loop."), e);
+                } else {
+                    return NULL;
+                }
         }
     }
 

Modified: logging/log4cxx/trunk/src/main/cpp/threadcxx.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/threadcxx.cpp?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/threadcxx.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/threadcxx.cpp Wed Mar 12 14:51:39 2008
@@ -104,17 +104,6 @@
 }
 #endif
 
-void Thread::stop() {
-#if APR_HAS_THREADS
-    if (thread != NULL) {
-                apr_status_t stat = apr_thread_exit((apr_thread_t*) thread, 0);
-                thread = NULL;
-                if (stat != APR_SUCCESS) {
-                        throw ThreadException(stat);
-                }
-        }
-#endif
-}
 
 void Thread::join() {
 #if APR_HAS_THREADS

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/thread.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/thread.h?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/thread.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/thread.h Wed Mar 12 14:51:39 2008
@@ -58,7 +58,6 @@
                          *  Runs the specified method on a newly created thread.
                          */
                         void run(Runnable start, void* data);
-                        void stop();
                         void join();
 
                         inline bool isActive() { return thread != 0; }

Modified: logging/log4cxx/trunk/src/main/include/log4cxx/net/telnetappender.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/net/telnetappender.h?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/net/telnetappender.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/net/telnetappender.h Wed Mar 12 14:51:39 2008
@@ -144,6 +144,8 @@
                         size_t activeConnections;
                         static void* LOG4CXX_THREAD_FUNC acceptConnections(helpers::log4cxx_thread_t* thread, void* data);
                 }; // class TelnetAppender
+                
+                LOG4CXX_PTR_DEF(TelnetAppender);
     } // namespace net
 } // namespace log4cxx
 

Modified: logging/log4cxx/trunk/src/test/cpp/net/telnetappendertestcase.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/cpp/net/telnetappendertestcase.cpp?rev=636527&r1=636526&r2=636527&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/test/cpp/net/telnetappendertestcase.cpp (original)
+++ logging/log4cxx/trunk/src/test/cpp/net/telnetappendertestcase.cpp Wed Mar 12 14:51:39 2008
@@ -16,10 +16,14 @@
  */
 
 #include <log4cxx/net/telnetappender.h>
+#include <log4cxx/ttcclayout.h>
 #include "../appenderskeletontestcase.h"
+#include <apr_thread_proc.h>
+#include <apr_time.h>
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
+using namespace log4cxx::net;
 
 #if APR_HAS_THREADS
 /**
@@ -33,14 +37,29 @@
                 //
                 LOGUNIT_TEST(testDefaultThreshold);
                 LOGUNIT_TEST(testSetOptionThreshold);
+                LOGUNIT_TEST(testActivateClose);
 
    LOGUNIT_TEST_SUITE_END();
 
+   enum { TEST_PORT = 1723 };
 
 public:
 
         AppenderSkeleton* createAppenderSkeleton() const {
           return new log4cxx::net::TelnetAppender();
+        }
+        
+        void testActivateClose() {
+            TelnetAppenderPtr appender(new TelnetAppender());
+            appender->setLayout(new TTCCLayout());
+            appender->setPort(TEST_PORT);
+            Pool p;
+            appender->activateOptions(p);
+            //
+            //   TODO: without the Thread::sleep, SocketImpl will NPE when trying to accept
+            //      connections on a closed socket.
+            Thread::sleep(1000);
+            appender->close();
         }
 };