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

Diff for /pegasus/src/Pegasus/Common/SpinLock.cpp between version 1.4 and 1.5

version 1.4, 2005/11/29 20:06:14 version 1.5, 2005/12/02 21:49:13
Line 47 
Line 47 
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
 SpinLock sharedSpinLocks[PEGASUS_NUM_SHARED_SPIN_LOCKS];  SpinLock spinLockPool[PEGASUS_NUM_SHARED_SPIN_LOCKS];
   int spinLockPoolInitialized;
  
 #ifdef PEGASUS_SPINLOCK_USE_PTHREADS #ifdef PEGASUS_SPINLOCK_USE_PTHREADS
 pthread_mutex_t _spinLockInitMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t _spinLockInitMutex = PTHREAD_MUTEX_INITIALIZER;
Line 55 
Line 56 
 static Mutex _spinLockInitMutex; static Mutex _spinLockInitMutex;
 #endif #endif
  
 void SpinLockConditionalCreate(SpinLock& lock)  void SpinLockCreatePool()
 { {
     // Use double-checked locking pattern to avoid mutex lock when possible.      // There's no need to check spinLockPoolInitialized before locking the
       // mutex, because the caller can check the flag before calling this
       // function.
  
     if (lock.initialized == 0)  
     {  
 #ifdef PEGASUS_SPINLOCK_USE_PTHREADS #ifdef PEGASUS_SPINLOCK_USE_PTHREADS
         pthread_mutex_lock(&_spinLockInitMutex);         pthread_mutex_lock(&_spinLockInitMutex);
 #else #else
         _spinLockInitMutex.lock(pegasus_thread_self());         _spinLockInitMutex.lock(pegasus_thread_self());
 #endif #endif
  
         if (lock.initialized == 0)      if (spinLockPoolInitialized == 0)
             SpinLockCreate(lock);      {
           for (size_t i = 0; i < PEGASUS_NUM_SHARED_SPIN_LOCKS; i++)
               SpinLockCreate(spinLockPool[i]);
   
           spinLockPoolInitialized = 1;
       }
  
 #ifdef PEGASUS_SPINLOCK_USE_PTHREADS #ifdef PEGASUS_SPINLOCK_USE_PTHREADS
         pthread_mutex_unlock(&_spinLockInitMutex);         pthread_mutex_unlock(&_spinLockInitMutex);
Line 76 
Line 82 
         _spinLockInitMutex.unlock();         _spinLockInitMutex.unlock();
 #endif #endif
     }     }
   
   #if defined(PEGASUS_SPINLOCK_USE_PTHREADS)
   
   // This function is called prior to forking.  We must obtain a lock
   // on every mutex that the child will inherit.  These will remain locked
   // until they are unlocked (by _unlockSpinLockPool()).  This prevents a
   // child process from waiting indefinitely on a mutex that was locked by
   // another thread in the parent process during the fork.
   
   void _lockSpinLockPool()
   {
       // Initialize the spinlock pool if not already done.
   
       if (spinLockPoolInitialized == 0)
           SpinLockCreatePool();
   
       pthread_mutex_lock(&_spinLockInitMutex);
   
       for (size_t i = 0; i < PEGASUS_NUM_SHARED_SPIN_LOCKS; i++)
           SpinLockLock(spinLockPool[i]);
   }
   
   // This function is called after forking.  It unlocks the mutexes that
   // were locked by _lockSpinLockPool() before the fork.
   
   void _unlockSpinLockPool()
   {
       pthread_mutex_unlock(&_spinLockInitMutex);
   
       for (size_t i = 0; i < PEGASUS_NUM_SHARED_SPIN_LOCKS; i++)
           SpinLockUnlock(spinLockPool[i]);
   }
   
   class SpinLockInitializer
   {
   public:
       SpinLockInitializer()
       {
           pthread_atfork(
               _lockSpinLockPool,
               _unlockSpinLockPool,
               _unlockSpinLockPool);
 } }
   };
   
   static SpinLockInitializer spinLockInitializer;
   
   #endif /* PEGASUS_SPINLOCK_USE_PTHREADS */
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2