00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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