(file) Return to Thread.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/Thread.cpp between version 1.29 and 1.29.4.1

version 1.29, 2002/09/20 02:06:18 version 1.29.4.1, 2002/10/30 14:40:38
Line 428 
Line 428 
    // first go thread the dead q and clean it up as much as possible    // first go thread the dead q and clean it up as much as possible
    while(_dead.count() > 0)    while(_dead.count() > 0)
    {    {
         PEGASUS_STD(cout) << "ThreadPool:: removing and joining dead thread" << PEGASUS_STD(endl);
       Thread *dead = _dead.remove_first();       Thread *dead = _dead.remove_first();
       if(dead == 0)       if(dead == 0)
          throw NullPointer();          throw NullPointer();
       if(dead->_handle.thid != 0)        dead->join();
       {  
          dead->detach();  
          destroy_thread(dead->_handle.thid, 0);  
          dead->_handle.thid = 0;  
          while(dead->_cleanup.count() )  
          {  
             // this may throw a permission exception,  
             // which I will remove from the code prior to stabilizing  
             dead->cleanup_pop(true);  
          }  
       }  
       delete dead;       delete dead;
       pegasus_sleep(1);  
    }    }
  
    DQueue<Thread> * map[2] =    DQueue<Thread> * map[2] =
Line 540 
Line 529 
  
                th = q->remove_no_lock((void *)th);                th = q->remove_no_lock((void *)th);
  
                // ATTN-DME-P3-20020919 This code assumes that the thread being  
                // killed is 'alive' and available to respond to a terminate  
                // request quickly. Since this code is only processing threads  
                // on the _pool (i.e., idle) queue this assumption is currently  
                // valid. However, this code should not be called if the  
                // thread is truly 'hung' or executing a long running request  
                // because it will cause this thread to wait.  
   
                if(th != 0)                if(th != 0)
                {                {
  
Line 568 
Line 549 
                      throw NullPointer();                      throw NullPointer();
                   }                   }
  
 #ifdef DO_NOT_IMPLEMENT_THREAD_POOL_FIX  
                   // The above code activates an idle thread to run the  
                   // _undertaker method. This will cause the thread to  
                   // terminate.  The issue with placing this  
                   // thread on the _dead queue is that it creates a timing  
                   // problem. If the kill_dead_threads procedure is called  
                   // before this thread has a chance to execute, or while  
                   // this thread is executing, the thread object may be  
                   // deleted prematurely.  This can cause the CIM Server  
                   // or the ThreadPool test to core dump or hang.  
                   //  
                   // put the thread on the dead  list  
                   _dead.insert_first(th);                   _dead.insert_first(th);
                   bodies++;                   bodies++;
                   sleep_sem->signal();                   sleep_sem->signal();
   
                   th->dereference_tsd();                   th->dereference_tsd();
                   th = 0;                   th = 0;
 #else  
                   // Wait until the thread exits before deleting the  
                   // thread object and related data structures.  
                   //  
                   th->cancel();  
                   th->dereference_tsd();  
                   sleep_sem->signal();  
                   th->join();  
                   th->empty_tsd();  
                   delete th;  
                   th=0;  
                   bodies++;  
 #endif  
                }                }
             }             }
             th = q->next(th);             th = q->next(th);
Line 642 
Line 597 
  
 PEGASUS_THREAD_RETURN ThreadPool::_undertaker( void *parm ) PEGASUS_THREAD_RETURN ThreadPool::_undertaker( void *parm )
 { {
    Thread *myself = reinterpret_cast<Thread *>(parm);     exit_thread((PEGASUS_THREAD_RETURN)1);
    if(myself != 0)     return (PEGASUS_THREAD_RETURN)1;
    {  
       myself->detach();  
 #ifdef DO_NOT_IMPLEMENT_THREAD_POOL_FIX  
       // Implementations of the join operation rely on the  
       // value of the handle.thid to implement the join operation.  
       // Setting this value to 0 can cause the thread  
       // issuing the join call to hang.  
       myself->_handle.thid = 0;  
 #endif  
       myself->cancel();  
       myself->test_cancel();  
       myself->exit_self(0);  
    }  
    return((PEGASUS_THREAD_RETURN)0);  
 } }
  
  


Legend:
Removed from v.1.29  
changed lines
  Added in v.1.29.4.1

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2