IBR-DTNSuite
0.8
|
00001 /* 00002 * AtomicCounter.cpp 00003 * 00004 * Created on: 12.02.2010 00005 * Author: morgenro 00006 */ 00007 00008 #include "ibrcommon/thread/AtomicCounter.h" 00009 #include "ibrcommon/thread/MutexLock.h" 00010 00011 namespace ibrcommon 00012 { 00013 AtomicCounter::AtomicCounter(int init) 00014 : _value(init), _unblock(false) 00015 { 00016 00017 } 00018 00019 AtomicCounter::~AtomicCounter() 00020 { 00021 unblockAll(); 00022 } 00023 00024 int AtomicCounter::value() 00025 { 00026 ibrcommon::MutexLock l(_lock); 00027 return _value; 00028 } 00029 00030 void AtomicCounter::unblockAll() 00031 { 00032 ibrcommon::MutexLock l(_lock); 00033 _unblock = true; 00034 _lock.signal(true); 00035 } 00036 00037 void AtomicCounter::wait(int until) 00038 { 00039 ibrcommon::MutexLock l(_lock); 00040 while ((_value != until) && !_unblock) 00041 { 00042 _lock.wait(); 00043 } 00044 } 00045 00046 AtomicCounter& AtomicCounter::operator++() 00047 { 00048 ibrcommon::MutexLock l(_lock); 00049 _value++; 00050 _lock.signal(true); 00051 return *this; 00052 } 00053 00054 AtomicCounter AtomicCounter::operator++(int) 00055 { 00056 ibrcommon::MutexLock l(_lock); 00057 _value++; 00058 _lock.signal(true); 00059 return AtomicCounter(_value - 1); 00060 } 00061 00062 AtomicCounter& AtomicCounter::operator--() 00063 { 00064 ibrcommon::MutexLock l(_lock); 00065 _value--; 00066 _lock.signal(true); 00067 return *this; 00068 } 00069 00070 AtomicCounter AtomicCounter::operator--(int) 00071 { 00072 ibrcommon::MutexLock l(_lock); 00073 _value--; 00074 _lock.signal(true); 00075 return AtomicCounter(_value + 1); 00076 } 00077 00078 AtomicCounter::Lock::Lock(AtomicCounter &counter) 00079 : _counter(counter) 00080 { 00081 _counter++; 00082 } 00083 00084 AtomicCounter::Lock::~Lock() 00085 { 00086 _counter--; 00087 } 00088 }