BUG#: 8699
authorvenkat.puvvada <venkat.puvvada>
Fri, 29 Jan 2010 14:32:55 +0000 (14:32 +0000)
committervenkat.puvvada <venkat.puvvada>
Fri, 29 Jan 2010 14:32:55 +0000 (14:32 +0000)
TITLE: newThread() may cause provider hangs
DESCRIPTION: Return NULL if thread cannot be created without loop when ENOMEM and EAGAIN is returned

src/Pegasus/ProviderManager2/CMPI/CMPILocalProviderManager.cpp
src/Pegasus/ProviderManager2/CMPI/CMPI_BrokerExt.cpp

index bd62710516c6ba65510e55170545469146309382..5ac1e9342952c0cf2923765a5ef59a7ef9d09362 100644 (file)
@@ -505,22 +505,19 @@ void CMPILocalProviderManager::cleanupThread(Thread *t, CMPIProvider *p)
     if (_reaperThread == 0)
     {
         _reaperThread = new Thread(_reaper, NULL, false);
-        ThreadStatus rtn = PEGASUS_THREAD_OK;
-        while ((rtn = _reaperThread->run()) != PEGASUS_THREAD_OK)
+
+        if (_reaperThread->run() != PEGASUS_THREAD_OK)
         {
-            if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES)
-                Threads::yield();
-            else
-            {
-                PEG_TRACE_CSTRING(
-                    TRC_PROVIDERMANAGER,
-                    Tracer::LEVEL1,
-                    "Could not allocate thread to take care of deleting "
-                    "user threads. ");
-                delete _reaperThread; _reaperThread = 0;
-                PEG_METHOD_EXIT();
-                return;
-            }
+            PEG_TRACE_CSTRING(
+                TRC_PROVIDERMANAGER,
+                Tracer::LEVEL1,
+                "Could not allocate thread to take care of deleting "
+                    "user threads, will be cleaned up later.");
+
+            delete _reaperThread; 
+            _reaperThread = 0;
+            PEG_METHOD_EXIT();
+            return;
         }
     }
     // Wake up the reaper.
index 0b842308be0c97aa5b1dc9afd9f7b17502f99bc0..c2e4744220487a34273ba7f7e28c383b9ca952ac 100644 (file)
@@ -159,25 +159,15 @@ extern "C"
         broker->provider->addThreadToWatch(t);
         data.release();
 
-        ThreadStatus rtn = PEGASUS_THREAD_OK;
-        while ((rtn = t->run()) != PEGASUS_THREAD_OK)
+        if (t->run() != PEGASUS_THREAD_OK)
         {
-            if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES)
-            {
-                Threads::yield();
-            }
-            else
-            {
-                PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1, \
-                    "Could not allocate provider thread (%p) for %s provider.",
-                    t, (const char *)broker->name.getCString()));
-                broker->provider->removeThreadFromWatch(t);
-                delete t;
-                t = 0;
-                break;
-            }
+            PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1, \
+                "Could not allocate provider thread (%p) for %s provider.",
+                t, (const char *)broker->name.getCString()));
+            broker->provider->removeThreadFromWatch(t);
+            t = NULL;
         }
-        if (rtn == PEGASUS_THREAD_OK)
+        else 
         {
             PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL3,
                 "Started provider thread (%p) for %s.",