demux_demuxer.hpp

00001 #line 134 "./lpsrc/flx_demux.pak"
00002 #ifndef __FLX_DEMUX_DEMUXER_H__
00003 #define __FLX_DEMUX_DEMUXER_H__
00004 #include <flx_demux_config.hpp>
00005 
00006 namespace flx { namespace demux {
00007 
00008 struct sel_param {
00009   char*   buffer;           // set on input
00010   long    buffer_size;        // set on input
00011   long    bytes_written;        // set on input and output
00012 
00013   bool    finished() { return bytes_written == buffer_size; }
00014 };
00015 
00016 // rename ...
00017 // read/write flags - they're no longer mutually exclusive
00018 enum { PDEMUX_READ = 1, PDEMUX_WRITE = 2, PDEMUX_EOF=4, PDEMUX_ERROR=8 };
00019 
00020 // base class/hook for implementing thread safe multithreaded demux quit
00021 // not that useful for single threaded implementations.
00022 class DEMUX_EXTERN demux_quit_flag
00023 {
00024 public:
00025   virtual void signal_true() = 0; // = signal finish
00026   virtual ~demux_quit_flag() {}
00027 };
00028 
00029 // ********************************************************
00030 /// Demux base.
00031 // ********************************************************
00032 class DEMUX_EXTERN demuxer {
00033 protected:
00034   // wait for outstanding events. may return before given events, so
00035   // check your conditions. I've turned of all the timeouts that cause
00036   // this, but don't rely on it!
00037   // FACTOR. Give poll a greedy interface
00038   virtual void  get_evts(bool poll) = 0;
00039 
00040   // for clean async takedown. contents guaranteed to be valid until
00041   // quit_flag->signal_true is called
00042   demux_quit_flag* quit_flag;
00043 public:
00044   demuxer() : quit_flag(0) {}
00045   virtual ~demuxer() {}
00046 
00047   void wait() { get_evts(false); }
00048   void poll() { get_evts(true); }
00049 
00050   // ask users of demuxer to exit. not guarded. be sure to either set & get
00051   // this flag from only one thread (with a wait/wakeup callback - see
00052   // self_piper) or by using a memory barrier.
00053   virtual demux_quit_flag* get_quit_flag() { return quit_flag; }
00054   virtual void set_quit_flag(demux_quit_flag* f) { quit_flag = f; }
00055 };
00056 
00057 // base class for callback from demuxer. useful when used in conjuction
00058 // with the self piper for implementing threadsafe demuxer quit and
00059 // guaranteeing responsiveness to new sockets.
00060 // run in the same thread that called d->wait/poll.
00061 class DEMUX_EXTERN demux_callback {
00062 public:
00063   virtual void callback(demuxer* d) = 0;
00064   virtual ~demux_callback() {}
00065 };
00066 
00067 }} // namespace demux, flx
00068 #endif  /* __DEMUXER__ */
00069 

Generated on Fri Jun 8 02:03:49 2007 for Felix by  doxygen 1.5.2