00001
00002 #ifndef __mailbox_hpp__
00003 #define __mailbox_hpp__
00004
00005 #include "mutex.hpp"
00006 #include "semaphore.hpp"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 template <class C> class MailBox
00025 {
00026 public:
00027 MailBox( int size = 20 ) : _size( size ){
00028 _array = new C [ _size ];
00029 _head = _tail = 0;
00030 _access = Mutex();
00031 _wakeup = Semaphore( 0 );
00032 }
00033
00034 ~MailBox() {
00035 delete [] _array;
00036 }
00037
00038 void flush() {
00039 _access.lock();
00040 _tail = _head;
00041 _access.unlock();
00042 }
00043
00044 void read( C& data ) {
00045 _wakeup.down();
00046 _access.lock();
00047 data = _array[ _tail ];
00048 _tail = (++_tail) % _size;
00049 _access.unlock();
00050 }
00051
00052 void mail( C& data ) {
00053 _access.lock();
00054 _array[ _head ] = data;
00055 _head = (++_head) % _size;
00056 _access.unlock();
00057 _wakeup.up();
00058 }
00059 private:
00060
00061 C* _array;
00062 int _size;
00063 int _head;
00064 int _tail;
00065
00066
00067 Mutex _access;
00068 Semaphore _wakeup;
00069 };
00070
00071 #endif // __mailbox_hpp__