From: <bi...@us...> - 2009-06-09 11:04:56
|
Revision: 4772 http://oorexx.svn.sourceforge.net/oorexx/?rev=4772&view=rev Author: bigrixx Date: 2009-06-09 11:04:54 +0000 (Tue, 09 Jun 2009) Log Message: ----------- [ oorexx-Bugs-2798276 ] System ressources exhausted since rexx4 upgrade Modified Paths: -------------- main/trunk/common/platform/unix/SysThread.cpp main/trunk/common/platform/unix/SysThread.hpp main/trunk/common/platform/windows/SysThread.cpp main/trunk/common/platform/windows/SysThread.hpp main/trunk/rexxapi/server/APIServer.cpp main/trunk/rexxapi/server/APIServer.hpp main/trunk/rexxapi/server/APIServerThread.cpp main/trunk/rexxapi/server/APIServerThread.hpp Modified: main/trunk/common/platform/unix/SysThread.cpp =================================================================== --- main/trunk/common/platform/unix/SysThread.cpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/common/platform/unix/SysThread.cpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -55,6 +55,7 @@ { // initialize the thread basics _threadID = pthread_self(); + attached = true; // we didn't create this one } @@ -86,7 +87,11 @@ void SysThread::terminate() { - pthread_detach(_threadID); + if (!attached && _threadID \= 0) + { + pthread_detach(_threadID); + _threadID = 0; + } } @@ -171,6 +176,7 @@ _threadID = 0; } pthread_attr_destroy(&newThreadAttr); + attached = false; // we own this thread return; } Modified: main/trunk/common/platform/unix/SysThread.hpp =================================================================== --- main/trunk/common/platform/unix/SysThread.hpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/common/platform/unix/SysThread.hpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -70,7 +70,7 @@ THREAD_STACK_SIZE = 1024*96 }; - SysThread() { ; } + SysThread() : attached(false), _threadID(0) { ; } virtual ~SysThread() { ; } SysThread(pthread_t tID) @@ -96,6 +96,7 @@ protected: void createThread(); + bool attached; // indicates whether this was a created thread or attached pthread_t _threadID; // thread identifier }; Modified: main/trunk/common/platform/windows/SysThread.cpp =================================================================== --- main/trunk/common/platform/windows/SysThread.cpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/common/platform/windows/SysThread.cpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -55,6 +55,8 @@ void SysThread::createThread() { _threadHandle = CreateThread(NULL, THREAD_STACK_SIZE, call_thread_function, this, 0, &_threadID); + // we created this one + attached = false; } void SysThread::dispatch() @@ -68,6 +70,7 @@ // initialize the thread basics _threadID = GetCurrentThreadId(); _threadHandle = GetCurrentThread(); + attached = true; // we don't own this one (and don't terminate it) } void SysThread::setPriority(ThreadPriority priority) @@ -115,7 +118,11 @@ /* Function: Do any platform specific thread termination */ /******************************************************************************/ { - CloseHandle(_threadHandle); // close the thread handle + if (!attached && _threadHandle != INVALID_HANDLE_VALUE) + { + CloseHandle(_threadHandle); // close the thread handle + _threadHandle = INVALID_HANDLE_VALUE; + } } Modified: main/trunk/common/platform/windows/SysThread.hpp =================================================================== --- main/trunk/common/platform/windows/SysThread.hpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/common/platform/windows/SysThread.hpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -69,7 +69,7 @@ THREAD_STACK_SIZE = 1024*512 }; - SysThread() {;} + SysThread() : attached(false), _threadHandle(INVALID_HANDLE_VALUE), _threadID(-1) {;} virtual ~SysThread() {;} SysThread(thread_id_t threadID) @@ -94,6 +94,7 @@ protected: void createThread(); + bool attached; // indicates whether this was a created thread or attached HANDLE _threadHandle; // thread handle DWORD _threadID; // thread identifier }; Modified: main/trunk/rexxapi/server/APIServer.cpp =================================================================== --- main/trunk/rexxapi/server/APIServer.cpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/rexxapi/server/APIServer.cpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -86,6 +86,10 @@ { // get a new connection. SysServerConnection *connection = server.connect(); + // we might have some terminated threads waiting + // for final resource cleanup...this is a good place to + // check for this. + cleanupTerminatedSessions(); // we have some sort of resource problem...force termination and shutdown. if (connection == NULL) { @@ -97,8 +101,43 @@ } } +/** + * Handle a session termination event. + * + * @param thread + */ +void APIServer::sessionTerminated(APIServerThread *thread) +{ + // we need to hold the lock while handling this + ServerLock(this); + // add to the queue for cleanup on the next opportunity + terminatedThreads.push_back(thread); +} + + /** + * Cleanup the resources devoted to threads that have + * terminated. + */ +void APIServer::cleanupTerminatedSessions() +{ + // we need to hold the lock while handling this + ServerLock(this); + + // clean up the connection pools + while (!terminatedThreads.empty()) + { + APIServerThread *thread = terminatedThreads.front(); + terminatedThreads.pop_front(); + // shut down the resources for this thread and release the memory + thread->terminate(); + delete thread; + } +} + + +/** * Process the Rexx API requests as a queue of messages. Each * message is handled through to completion, so the message * queue is the synchronization point. Modified: main/trunk/rexxapi/server/APIServer.hpp =================================================================== --- main/trunk/rexxapi/server/APIServer.hpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/rexxapi/server/APIServer.hpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -44,8 +44,10 @@ #include "RegistrationManager.hpp" #include "QueueManager.hpp" #include "SysSemaphore.hpp" +#include <list> class APIServerInstance; +class APIServerThread; class APIServer { @@ -64,6 +66,8 @@ void releaseLock(); APIServerInstance *getInstance(ServiceMessage &m); void dispatch(ServiceMessage &message); + void sessionTerminated(APIServerThread *thread); + void cleanupTerminatedSessions(); protected: @@ -71,6 +75,7 @@ SysServerStream server; // our server message pipeline bool serverActive; // the server is running APIServerInstance *instances; // our chain of active instances + std::list<APIServerThread *> terminatedThreads; // connection pool }; Modified: main/trunk/rexxapi/server/APIServerThread.cpp =================================================================== --- main/trunk/rexxapi/server/APIServerThread.cpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/rexxapi/server/APIServerThread.cpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -54,4 +54,5 @@ { // just dispatch this back to the api server for handling server->processMessages(connection); + server->sessionTerminated(this); } Modified: main/trunk/rexxapi/server/APIServerThread.hpp =================================================================== --- main/trunk/rexxapi/server/APIServerThread.hpp 2009-06-08 15:23:02 UTC (rev 4771) +++ main/trunk/rexxapi/server/APIServerThread.hpp 2009-06-09 11:04:54 UTC (rev 4772) @@ -47,6 +47,7 @@ public: inline APIServerThread(APIServer *s, SysServerConnection *c) : SysThread(), server(s), connection(c) { } + inline ~APIServerThread() { terminate(); } void start(); virtual void dispatch(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |