SysSignalFlag.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/SysSignalFlag.h>
00017 
00018 Cntm::SpecUtils::SysSignalFlag::SysSignalFlag(bool AutoReset, bool Init): 
00019         autoReset(AutoReset), mutex(false), flag(Init)
00020 {
00021         pthread_cond_init(&cond, NULL); 
00022 }
00023 
00024 Cntm::SpecUtils::SysSignalFlag::~SysSignalFlag()
00025 {
00026         pthread_cond_destroy(&cond);
00027 }
00028 
00029 bool Cntm::SpecUtils::SysSignalFlag::Wait(bool Infinite, uint MSecTimeOut)
00030 {
00031         SysCriticalSection::Lock lock(mutex);
00032         
00033         bool res = true;
00034         if (Infinite)
00035         {
00036                 while (!flag) pthread_cond_wait(&cond, mutex.PthreadMutex());
00037         }
00038         else
00039         {
00040                 timeval now;
00041                 timespec tm;
00042                 gettimeofday(&now, NULL);
00043                 tm.tv_nsec = now.tv_usec * 1000 + (MSecTimeOut % 1000) * 1000000;
00044                 tm.tv_sec = now.tv_sec + MSecTimeOut / 1000;
00045                 tm.tv_sec += tm.tv_nsec / 1000000000;
00046                 tm.tv_nsec = tm.tv_nsec % 1000000000;
00047                 
00048                 int err = 0;
00049                 while (!flag && err != ETIMEDOUT)
00050                         err = pthread_cond_timedwait(&cond, mutex.PthreadMutex(), &tm);
00051                 
00052                 res = flag;
00053         }
00054 
00055         if (autoReset) flag = false;
00056         
00057         return res;
00058 }
00059 
00060 void Cntm::SpecUtils::SysSignalFlag::Set()
00061 {
00062         SysCriticalSection::Lock lock(mutex);
00063         flag = true;
00064         SignalCond();
00065 }
00066 
00067 void Cntm::SpecUtils::SysSignalFlag::Reset()
00068 {
00069         SysCriticalSection::Lock lock(mutex);
00070         flag = false;
00071 }
00072 
00073 void Cntm::SpecUtils::SysSignalFlag::SignalCond()
00074 {
00075         if ((autoReset? pthread_cond_signal(&cond) : pthread_cond_broadcast(&cond)) != 0)
00076                 throw SystemException("Cntm::SpecUtils::SignalImpl::SignalCond", "cond_signal");
00077 }
00078 

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