void MyObjectI::amdAddWithRetry_async(const Test::AMD_MyObject_amdAddWithRetryPtr& cb, int x, int y, const Ice::Current& current) { class ThreadI : public Thread { public: ThreadI(const Test::AMD_MyObject_amdAddWithRetryPtr& cb, int x, int y) : _cb(cb), _x(x), _y(y) { } void run() { ThreadControl::sleep(Time::milliSeconds(10)); _cb->ice_response(_x + _y); } private: Test::AMD_MyObject_amdAddWithRetryPtr _cb; int _x; int _y; }; ThreadPtr thread = new ThreadI(cb, x, y); thread->start().detach(); Ice::Context::const_iterator p = current.ctx.find("retry"); if(p == current.ctx.end() || p->second != "no") { throw Test::RetryException(__FILE__, __LINE__); } }
void MyObjectI::amdAdd_async(const Test::AMD_MyObject_amdAddPtr& cb, int x, int y, const Ice::Current&) { class ThreadI : public Thread { public: ThreadI(const Test::AMD_MyObject_amdAddPtr& cb, int x, int y) : _cb(cb), _x(x), _y(y) { } void run() { ThreadControl::sleep(Time::milliSeconds(10)); _cb->ice_response(_x + _y); } private: Test::AMD_MyObject_amdAddPtr _cb; int _x; int _y; }; ThreadPtr thread = new ThreadI(cb, x, y); thread->start().detach(); }
void MyObjectI::amdBadAdd_async(const Test::AMD_MyObject_amdBadAddPtr& cb, int, int, const Ice::Current&) { class ThreadI : public Thread { public: ThreadI(const Test::AMD_MyObject_amdBadAddPtr& cb) : _cb(cb) { } void run() { ThreadControl::sleep(Time::milliSeconds(10)); Test::InvalidInputException e; _cb->ice_exception(e); } private: Test::AMD_MyObject_amdBadAddPtr _cb; }; ThreadPtr thread = new ThreadI(cb); thread->start().detach(); }
ThreadPool::ThreadPool(int size , int sizeMax, int sizeWarn,int listSizeMax,int stackSize) : _destroyed(false), _listSize( 0 ), _procSize( 0 ), _listSizeMax( listSizeMax), _size(size), _sizeMax(sizeMax), _sizeWarn(sizeWarn), _stackSize(0), _running(0), _inUse(0), _load(1.0), _promote(true), _waitingNumber(0) { if ( size < 1 ) size = 1; if ( sizeMax < size ) sizeMax = size; if ( sizeWarn > sizeMax ) sizeWarn = sizeMax; if ( stackSize < 0 ) stackSize = 16 * 1024 * 1024; const_cast<int&>(_size) = size; const_cast<int&>(_sizeMax) = sizeMax; const_cast<int&>(_sizeWarn) = sizeWarn; const_cast<size_t&>(_stackSize) = static_cast<size_t>(stackSize); try { for(int i = 0 ; i < _size ; ++i) { ThreadPtr thread = new EventHandlerThread(this); thread->start(_stackSize); _threads.push_back(thread); ++_running; } } catch(const Exception& ex) { destroy(); joinWithAllThreads(); } }
WebEventServiceImpl::WebEventServiceImpl(Poco::OSP::BundleContext::Ptr pContext, int maxSockets): _pContext(pContext), _maxSockets(maxSockets), _mainRunnable(*this, &WebEventServiceImpl::runMain), _workerRunnable(*this, &WebEventServiceImpl::runWorker), _stopped(false) { unsigned workerCount = 2*Poco::Environment::processorCount(); for (unsigned i = 0; i < workerCount; i++) { ThreadPtr pThread = new Poco::Thread; pThread->start(_workerRunnable); _workerThreads.push_back(pThread); } _mainThread.start(_mainRunnable); }
void ThreadPool::promoteFollower( pthread_t thid ) { if(_sizeMax > 1) { this->lock(); assert(!_promote); _promote = true; this->notify(); if(!_destroyed) { assert(_inUse >= 0); ++_inUse; if(_inUse == _sizeWarn) { } assert(_inUse <= _running); if(_inUse < _sizeMax && _inUse == _running) { try { ThreadPtr thread = new EventHandlerThread(this); thread->start(_stackSize); _threads.push_back(thread); ++_running; } catch(const Exception& ex) { throw ThreadCreateException(__FILE__,__LINE__); } } } this->unlock(); } }
void MyObjectI::amdBadSystemAdd_async(const Test::AMD_MyObject_amdBadSystemAddPtr& cb, int, int, const Ice::Current&) { class ThreadI : public Thread { public: ThreadI(const Test::AMD_MyObject_amdBadSystemAddPtr& cb) : _cb(cb) { } void run() { ThreadControl::sleep(Time::milliSeconds(10)); _cb->ice_exception(Ice::InitializationException(__FILE__, __LINE__, "just testing")); } private: Test::AMD_MyObject_amdBadSystemAddPtr _cb; }; ThreadPtr thread = new ThreadI(cb); thread->start().detach(); }
void PriorityInversionTest::run() { int cores, high, medium, low, timeout; timeout = 30; #ifdef _WIN32 return; //Priority inversion is not supported by WIN32 #else try { IceUtil::Mutex m; } catch(const IceUtil::ThreadSyscallException&) { return; // Mutex protocol PrioInherit not supported } cores = static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN)); high = 45; medium = 35; low = 1; #endif { Monitor<Mutex> monitor; TaskCollectorPtr collector = new TaskCollector(cores, high, medium, low, monitor); vector<ThreadControl> threads; SharedResourcePtr shared = new SharedResourceMutex(collector); // // Create one low priority thread. // TaskPtr lowThread = new Task(shared); threads.push_back(lowThread->start(128, low)); lowThread->waitAcquired(); // // Create one high priority thread that use the same shared resource // as the previous low priority thread // TaskPtr highThread = new Task(shared); threads.push_back(highThread->start(128, high)); // // Create one medium priority thread per core. // for(int cont = 0; cont < cores; ++cont) { ThreadPtr t = new MediumPriorityThread(collector, highThread, timeout); threads.push_back(t->start(128, medium)); } // // Join with all the threads. // vector<ThreadControl>::iterator it; for(it = threads.begin(); it != threads.end(); ++it) { try { (*it).join(); } catch(...) { } } } // // Same test with a recursive mutex. // { Monitor<Mutex> monitor; TaskCollectorPtr collector = new TaskCollector(cores, high, medium, low, monitor); SharedResourcePtr shared = new SharedResourceRecMutex(collector); vector<ThreadControl> threads; // // Create one low priority thread. // TaskPtr lowThread = new Task(shared); threads.push_back(lowThread->start(128, low)); lowThread->waitAcquired(); // // Create one high priority thread that use the same shared resource // as the previous low priority thread. // ThreadPtr highThread = new Task(shared); threads.push_back(highThread->start(128, high)); // // Create one medium priority tasks per core that runs until // the high priority thread is running. // for(int cont = 0; cont < cores; ++cont) { ThreadPtr t = new MediumPriorityThread(collector, highThread, timeout); threads.push_back(t->start(128, medium)); } // // Join with all the threads. // vector<ThreadControl>::iterator it; for(it = threads.begin(); it != threads.end(); ++it) { try { (*it).join(); } catch(...) { } } } }