(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.34 and 1.35

version 1.34, 2003/03/20 15:51:27 version 1.35, 2003/04/07 20:29:23
Line 183 
Line 183 
  
 ThreadPool::~ThreadPool(void) ThreadPool::~ThreadPool(void)
 { {
      try
   try {     {
    _pools.remove(this);    _pools.remove(this);
    _dying++;    _dying++;
    Thread *th = 0;    Thread *th = 0;
Line 232 
Line 232 
       th = _dead.remove_first();       th = _dead.remove_first();
    }    }
   }   }
   catch(...){}     catch(...)
      {
      }
 } }
  
 // make this static to the class // make this static to the class
Line 240 
Line 242 
 { {
    PEG_METHOD_ENTER(TRC_THREAD, "ThreadPool::_loop");    PEG_METHOD_ENTER(TRC_THREAD, "ThreadPool::_loop");
  
    Tracer::trace(TRC_THREAD, Tracer::LEVEL4, "ThreadPool::_loop entered");  
    Thread *myself = (Thread *)parm;    Thread *myself = (Thread *)parm;
    if(myself == 0)    if(myself == 0)
    {    {
Line 267 
Line 268 
    }    }
    catch(IPCException &)    catch(IPCException &)
    {    {
       Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                     "IPCException Caught - EXITING");  
       PEG_METHOD_EXIT();       PEG_METHOD_EXIT();
       myself->exit_self(0);       myself->exit_self(0);
    }    }
    catch(...)    catch(...)
    {    {
       Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                     "Unknown  Exception Caught - EXITING");  
       PEG_METHOD_EXIT();       PEG_METHOD_EXIT();
       myself->exit_self(0);       myself->exit_self(0);
    }    }
  
    if(sleep_sem == 0 || deadlock_timer == 0)    if(sleep_sem == 0 || deadlock_timer == 0)
    {    {
       Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                     "NULL Semaphore  - EXITING");  
       PEG_METHOD_EXIT();       PEG_METHOD_EXIT();
       throw NullPointer();       throw NullPointer();
    }    }
  
    while(pool->_dying < 1)    while(pool->_dying < 1)
    {    {
       Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                     "ThreadPool::_loop - waiting on semaphore");  
       sleep_sem->wait();       sleep_sem->wait();
       Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                     "ThreadPool::_loop - awakened from semaphore");  
       // when we awaken we reside on the running queue, not the pool queue       // when we awaken we reside on the running queue, not the pool queue
       if(pool->_dying > 0)       if(pool->_dying > 0)
          break;          break;
  
   
       PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *_work)(void *) = 0;       PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *_work)(void *) = 0;
       void *parm = 0;       void *parm = 0;
  
Line 316 
Line 307 
       }       }
       catch(IPCException &)       catch(IPCException &)
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "IPCException Caught - EXITING");  
          PEG_METHOD_EXIT();          PEG_METHOD_EXIT();
          myself->exit_self(0);          myself->exit_self(0);
       }       }
  
       if(_work == 0)       if(_work == 0)
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "NULL work pointer - EXITING");  
          PEG_METHOD_EXIT();          PEG_METHOD_EXIT();
          throw NullPointer();          throw NullPointer();
       }       }
Line 333 
Line 320 
       if(_work ==       if(_work ==
          (PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *)(void *)) &_undertaker)          (PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *)(void *)) &_undertaker)
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "Calling the Undertaker");  
          _work(parm);          _work(parm);
       }       }
  
       gettimeofday(deadlock_timer, NULL);       gettimeofday(deadlock_timer, NULL);
       try       try
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "ThreadPool::_loop - calling work routine");  
          _work(parm);          _work(parm);
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "ThreadPool::_loop - returned from work routine");  
       }       }
       catch(...)       catch(...)
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "Unknown  Exception Caught - EXITING");  
          gettimeofday(deadlock_timer, NULL);          gettimeofday(deadlock_timer, NULL);
       }       }
       gettimeofday(deadlock_timer, NULL);       gettimeofday(deadlock_timer, NULL);
Line 365 
Line 344 
       }       }
       catch(IPCException &)       catch(IPCException &)
       {       {
          Tracer::trace(__FILE__, __LINE__, TRC_THREAD, Tracer::LEVEL4,  
                        "IPCException Caught - EXITING");  
          PEG_METHOD_EXIT();          PEG_METHOD_EXIT();
          myself->exit_self(0);          myself->exit_self(0);
       }       }
Line 403 
Line 380 
           th = _init_thread();           th = _init_thread();
           continue;           continue;
         }         }
         pegasus_yield();
       pegasus_sleep(1);  
       th = _pool.remove_first();       th = _pool.remove_first();
    }    }
  
Line 676 
Line 652 
  
  Thread *ThreadPool::_init_thread(void) throw(IPCException)  Thread *ThreadPool::_init_thread(void) throw(IPCException)
 { {
    PEG_METHOD_ENTER(TRC_THREAD, "ThreadPool::_init_thread");  
    Thread *th = (Thread *) new Thread(_loop, this, false);    Thread *th = (Thread *) new Thread(_loop, this, false);
    // allocate a sleep semaphore and pass it in the thread context    // allocate a sleep semaphore and pass it in the thread context
    // initial count is zero, loop function will sleep until    // initial count is zero, loop function will sleep until
Line 685 
Line 660 
    th->put_tsd("sleep sem", &_sleep_sem_del, sizeof(Semaphore), (void *)sleep_sem);    th->put_tsd("sleep sem", &_sleep_sem_del, sizeof(Semaphore), (void *)sleep_sem);
  
    struct timeval *dldt = (struct timeval *) ::operator new(sizeof(struct timeval));    struct timeval *dldt = (struct timeval *) ::operator new(sizeof(struct timeval));
      pegasus_gettimeofday(dldt);
   
    th->put_tsd("deadlock timer", thread_data::default_delete, sizeof(struct timeval), (void *)dldt);    th->put_tsd("deadlock timer", thread_data::default_delete, sizeof(struct timeval), (void *)dldt);
    // thread will enter _loop(void *) and sleep on sleep_sem until we signal it    // thread will enter _loop(void *) and sleep on sleep_sem until we signal it
    th->run();    th->run();
    _current_threads++;    _current_threads++;
    pegasus_yield();    pegasus_yield();
    PEG_METHOD_EXIT();  
  
    return th;    return th;
 } }


Legend:
Removed from v.1.34  
changed lines
  Added in v.1.35

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2