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 }
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |