libcrbn/rendering/mailbox.hpp

00001 
00002 #ifndef __mailbox_hpp__
00003 #define __mailbox_hpp__
00004 
00005 #include "mutex.hpp"
00006 #include "semaphore.hpp"
00007 
00008 /*
00009   La boite au lettre est une des structures couramment utilisée pour de la
00010   communication inter processus. La structure sous-jacente est de type FIFO.
00011 
00012   Dans le cas présent, cette structure est un tampon circulaire et n'ayant
00013   qu'un nombre limité d'élément (en plus ce sont des entiers), je n'ai pas
00014   besoin d'une structure plus compliquée.
00015 
00016   Un point à noter est que la vérification si le tampon contient un message
00017   est inutile car '_wakeup' ne peut être pris que s'il y a au moins un
00018   message.
00019 
00020   Pour l'écriture, le test de débordement est aussi inutile car il est
00021   théoriquement impossible d'avoir plus de message (des jetons en fait)
00022   que de place.
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   // data and relative stuff
00061   C* _array;
00062   int _size;
00063   int _head;
00064   int _tail;
00065 
00066   // protected access
00067   Mutex _access;
00068   Semaphore _wakeup;
00069 };
00070 
00071 #endif // __mailbox_hpp__

Generated on Tue Nov 14 15:40:08 2006 for libcrbn by  doxygen 1.5.0