www.pudn.com > mysee.zip > CriticalSection.h


/* 
*  Openmysee 
* 
*  This program is free software; you can redistribute it and/or modify 
*  it under the terms of the GNU General Public License as published by 
*  the Free Software Foundation; either version 2 of the License, or 
*  (at your option) any later version. 
* 
*  This program is distributed in the hope that it will be useful, 
*  but WITHOUT ANY WARRANTY; without even the implied warranty of 
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
*  GNU General Public License for more details. 
* 
*  You should have received a copy of the GNU General Public License 
*  along with this program; if not, write to the Free Software 
*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
* 
*/ 
#ifndef __CRISECTION_H 
#define __CRISECTION_H 
 
namespace UC 
{ 
#ifdef WIN32 
     
#include  
     
#else 
     
#include  
#include  
#endif//_XNIX 
     
     
    class CCriticalSection 
    { 
    private: 
        //windows OS 
#ifdef WIN32 
        CRITICAL_SECTION	moSection; 
#else 
        pthread_mutex_t mMutex; 
#endif 
         
         
    public: 
        CCriticalSection() 
        { 
#ifdef WIN32 
            InitializeCriticalSection(&moSection); 
#else 
            mMutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; 
            //pthread_mutex_init(&mMutex,NULL); 
#endif 
        }; 
        ~CCriticalSection() 
        { 
#ifdef WIN32 
            DeleteCriticalSection(&moSection); 
#else 
            pthread_mutex_destory(&mMutex); 
#endif 
        } 
        void  inline Enter() 
        { 
#ifdef WIN32 
            EnterCriticalSection(&moSection); 
#else 
            pthread_mutex_lock(&mMutex); 
#endif 
        } 
        void inline Leave() 
        { 
#ifdef WIN32 
            LeaveCriticalSection(&moSection); 
#else 
            pthread_mutex_unlock(&mMutex); 
#endif 
        }; 
         
    }; 
    class CCriticalSectionHelper 
    { 
    public: 
        CCriticalSectionHelper(CCriticalSection& aCriticalSection) 
            :moCriticalSection(aCriticalSection) 
        { 
            moCriticalSection.Enter(); 
        };	 
        ~CCriticalSectionHelper(){ 
            moCriticalSection.Leave(); 
        } 
    private: 
        CCriticalSection& moCriticalSection; 
    }; 
}; 
#endif // __CRISECTION_H