IBR-DTNSuite  0.8
ibrcommon/ibrcommon/thread/AtomicCounter.cpp
Go to the documentation of this file.
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 }