From c349742cf532d862c5d78bc74666171e56b2ca74 Mon Sep 17 00:00:00 2001 From: Marian Krivos Date: Tue, 23 Aug 2011 07:12:01 +0000 Subject: [PATCH] trunk/branch integration: VxWorks & Wince --- Foundation/src/Thread.cpp | 4 +- Foundation/src/ThreadPool.cpp | 86 ++++++++++++++++----------------- Foundation/src/Thread_POSIX.cpp | 14 +++--- Foundation/src/Thread_WIN32.cpp | 9 ++-- 4 files changed, 59 insertions(+), 54 deletions(-) diff --git a/Foundation/src/Thread.cpp b/Foundation/src/Thread.cpp index a2df4961b..d28cae59a 100644 --- a/Foundation/src/Thread.cpp +++ b/Foundation/src/Thread.cpp @@ -1,7 +1,7 @@ // // Thread.cpp // -// $Id: //poco/Main/Foundation/src/Thread.cpp#16 $ +// $Id: //poco/1.4/Foundation/src/Thread.cpp#2 $ // // Library: Foundation // Package: Threading @@ -47,6 +47,8 @@ #else #include "Thread_WIN32.cpp" #endif +#elif defined(POCO_VXWORKS) +#include "Thread_VX.cpp" #else #include "Thread_POSIX.cpp" #endif diff --git a/Foundation/src/ThreadPool.cpp b/Foundation/src/ThreadPool.cpp index ed675279a..bcb58cd90 100644 --- a/Foundation/src/ThreadPool.cpp +++ b/Foundation/src/ThreadPool.cpp @@ -16,14 +16,14 @@ // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: -// +// // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -79,11 +79,11 @@ private: }; -PooledThread::PooledThread(const std::string& name, int stackSize): - _idle(true), - _idleTime(0), - _pTarget(0), - _name(name), +PooledThread::PooledThread(const std::string& name, int stackSize): + _idle(true), + _idleTime(0), + _pTarget(0), + _name(name), _thread(name), _targetCompleted(false) { @@ -112,7 +112,7 @@ void PooledThread::start() void PooledThread::start(Thread::Priority priority, Runnable& target) { FastMutex::ScopedLock lock(_mutex); - + poco_assert (_pTarget == 0); _pTarget = ⌖ @@ -138,7 +138,7 @@ void PooledThread::start(Thread::Priority priority, Runnable& target, const std: } _thread.setName(fullName); _thread.setPriority(priority); - + poco_assert (_pTarget == 0); _pTarget = ⌖ @@ -177,7 +177,7 @@ void PooledThread::join() void PooledThread::activate() { FastMutex::ScopedLock lock(_mutex); - + poco_assert (_idle); _idle = false; _targetCompleted.reset(); @@ -188,19 +188,19 @@ void PooledThread::release() { const long JOIN_TIMEOUT = 10000; - _mutex.lock(); - _pTarget = 0; - _mutex.unlock(); - // In case of a statically allocated thread pool (such - // as the default thread pool), Windows may have already - // terminated the thread before we got here. - if (_thread.isRunning()) - _targetReady.set(); + _mutex.lock(); + _pTarget = 0; + _mutex.unlock(); + // In case of a statically allocated thread pool (such + // as the default thread pool), Windows may have already + // terminated the thread before we got here. + if (_thread.isRunning()) + _targetReady.set(); - if (_thread.tryJoin(JOIN_TIMEOUT)) - { - delete this; - } + if (_thread.tryJoin(JOIN_TIMEOUT)) + { + delete this; + } } @@ -255,9 +255,9 @@ void PooledThread::run() ThreadPool::ThreadPool(int minCapacity, int maxCapacity, int idleTime, - int stackSize): - _minCapacity(minCapacity), - _maxCapacity(maxCapacity), + int stackSize): + _minCapacity(minCapacity), + _maxCapacity(maxCapacity), _idleTime(idleTime), _serial(0), _age(0), @@ -280,8 +280,8 @@ ThreadPool::ThreadPool(const std::string& name, int idleTime, int stackSize): _name(name), - _minCapacity(minCapacity), - _maxCapacity(maxCapacity), + _minCapacity(minCapacity), + _maxCapacity(maxCapacity), _idleTime(idleTime), _serial(0), _age(0), @@ -421,15 +421,15 @@ void ThreadPool::housekeep() ThreadVec activeThreads; idleThreads.reserve(_threads.size()); activeThreads.reserve(_threads.size()); - + for (ThreadVec::iterator it = _threads.begin(); it != _threads.end(); ++it) { if ((*it)->idle()) { if ((*it)->idleTime() < _idleTime) idleThreads.push_back(*it); - else - expiredThreads.push_back(*it); + else + expiredThreads.push_back(*it); } else activeThreads.push_back(*it); } @@ -467,17 +467,17 @@ PooledThread* ThreadPool::getThread() { if (_threads.size() < _maxCapacity) { - pThread = createThread(); - try - { - pThread->start(); - _threads.push_back(pThread); - } - catch(SystemException& e) - { - delete pThread; - throw; - } + pThread = createThread(); + try + { + pThread->start(); + _threads.push_back(pThread); + } + catch (...) + { + delete pThread; + throw; + } } else throw NoThreadAvailableException(); } @@ -508,7 +508,7 @@ public: ThreadPool* pool() { FastMutex::ScopedLock lock(_mutex); - + if (!_pPool) { _pPool = new ThreadPool("default"); @@ -517,7 +517,7 @@ public: } return _pPool; } - + private: ThreadPool* _pPool; FastMutex _mutex; diff --git a/Foundation/src/Thread_POSIX.cpp b/Foundation/src/Thread_POSIX.cpp index 2d0deaf83..2c5875ec7 100644 --- a/Foundation/src/Thread_POSIX.cpp +++ b/Foundation/src/Thread_POSIX.cpp @@ -161,13 +161,15 @@ void ThreadImpl::setStackSizeImpl(int size) { #if defined(__APPLE__) // we must round up to a multiple of the memory page size - const int PAGE_SIZE = 4096; - size = ((size + PAGE_SIZE - 1)/PAGE_SIZE)*PAGE_SIZE; + const int PAGE_SIZE = 4096; + size = ((size + PAGE_SIZE - 1)/PAGE_SIZE)*PAGE_SIZE; #endif - if (size < PTHREAD_STACK_MIN) - size = PTHREAD_STACK_MIN; - } - _pData->stackSize = size; +#if !defined(POCO_ANDROID) + if (size < PTHREAD_STACK_MIN) + size = PTHREAD_STACK_MIN; +#endif + } + _pData->stackSize = size; #endif } diff --git a/Foundation/src/Thread_WIN32.cpp b/Foundation/src/Thread_WIN32.cpp index 2f377dc66..a46f27d60 100644 --- a/Foundation/src/Thread_WIN32.cpp +++ b/Foundation/src/Thread_WIN32.cpp @@ -141,11 +141,12 @@ void ThreadImpl::startImpl(Runnable& target) void ThreadImpl::startImpl(Callable target, void* pData) { - if (isRunningImpl()) - throw SystemException("thread already running"); + if (isRunningImpl()) + throw SystemException("thread already running"); - _callbackTarget.callback = target; - _callbackTarget.pData = pData; + threadCleanup(); + _callbackTarget.callback = target; + _callbackTarget.pData = pData; createImpl(callableEntry, this); }