void testDestructAsThreadCompletes() { AtomicInt cancelled(0); struct timeval deallocateWait = {0, 0}; ThreadPool* threadPool = new ThreadPool(0, "Tester", 0, 1, deallocateWait); threadPool->allocate_and_awaken(&cancelled, funcSleepUntilCancelled); cancelled = 1; delete threadPool; }
void testHighWorkload() { if (verbose) { cout << "testHighWorkload" << endl; } try { AtomicInt counter(0); struct timeval deallocateWait = { 0, 1 }; ThreadPool* threadPool = new ThreadPool(0, "test workload", 0, 10, deallocateWait); for (Uint32 i = 0; i < 50; i++) { ThreadStatus rc = PEGASUS_THREAD_OK; while ( (rc =threadPool->allocate_and_awaken( &counter, funcIncrementCounter)) != PEGASUS_THREAD_OK) { if (rc == PEGASUS_THREAD_INSUFFICIENT_RESOURCES) { Threads::yield(); } else { throw Exception("Could not allocate a thread for counter"); } } } delete threadPool; PEGASUS_TEST_ASSERT(counter.get() == 50); } catch (const Exception& e) { cout << "Exception in testHighWorkload: " << e.getMessage() << endl; PEGASUS_TEST_ASSERT(false); } }
void CIMListenerIndicationDispatcherRep::deliverIndication(String url, CIMInstance instance, ContentLanguageList contentLangs) { // go thru all consumers and broadcast the result; // should be run in seperate thread AutoPtr<Iterator> it( _consumers->iterator() ); while(it->hasNext()==true) { CIMIndicationConsumer* consumer = static_cast<CIMIndicationConsumer*>(it->next()); CIMListenerIndicationDispatchEvent* event = new CIMListenerIndicationDispatchEvent(consumer, url, instance, contentLangs); ThreadStatus rtn = _thread_pool->allocate_and_awaken( event,deliver_routine); if (rtn != PEGASUS_THREAD_OK) { PEG_TRACE_CSTRING( TRC_SERVER, Tracer::LEVEL1, "Could not allocate thread to deliver event." " Instead using current thread."); delete event; throw Exception(MessageLoaderParms( "Listener.CIMListenerIndicationDispatcher." "CANNOT_ALLOCATE_THREAD", "Not enough threads to allocate a worker to deliver the" " event.")); } } }