SysCriticalSection.cpp

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #include <errno.h>
00015 #include <Cntm/Exceptions/SystemException.h>
00016 #include <Cntm/SystemUtils/SysCriticalSection.h>
00017 
00018 Cntm::SpecUtils::SysCriticalSection::SysCriticalSection(bool Recurse)
00019 {
00020         int err;
00021         if (Recurse)
00022         {
00023                 pthread_mutexattr_t attr;
00024                 pthread_mutexattr_init(&attr);
00025                 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
00026                 err = pthread_mutex_init(&mutex, &attr);
00027                 pthread_mutexattr_destroy(&attr);
00028         }
00029         else
00030         {
00031                 err = pthread_mutex_init(&mutex, NULL);
00032         }
00033         
00034         if (err != 0)
00035                 throw SystemException("Cntm::SpecUtils::CritSectImpl::CritSectImpl", 
00036                         "pthread_mutex_init");  
00037 }
00038 
00039 Cntm::SpecUtils::SysCriticalSection::~SysCriticalSection()
00040 {
00041         pthread_mutex_destroy(&mutex);
00042 }
00043 
00044 void Cntm::SpecUtils::SysCriticalSection::Enter()
00045 {
00046         if (pthread_mutex_lock(&mutex) != 0)
00047                 throw SystemException("Cntm::SpecUtils::CritSectImpl::Enter", "mutex_lock");
00048 }
00049 
00050 bool Cntm::SpecUtils::SysCriticalSection::TryEnter()
00051 {
00052         switch (pthread_mutex_trylock(&mutex))
00053         {
00054                 case 0: return true;
00055                 case EBUSY: return false;
00056                 default: throw SystemException("Cntm::SpecUtils::CritSectImpl::TryEnter",       "mutex_trylock");
00057         }
00058 }
00059 
00060 void Cntm::SpecUtils::SysCriticalSection::Leave()
00061 {
00062         if (pthread_mutex_unlock(&mutex) != 0)
00063                 throw SystemException("Cntm::SpecUtils::CritSectImpl::Leave", "mutex_unlock");
00064 }

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3