faio_posixio.hpp

00001 #line 870 "./lpsrc/flx_faio.pak"
00002 #ifndef __FAIO_POSIXIO__
00003 #define __FAIO_POSIXIO__
00004 #include <flx_faio_config.hpp>
00005 
00006 #include "faio_asyncio.hpp"
00007 #include "faio_drv.hpp"
00008 
00009 // we don't need to piggyback much data at all. for now just the demuxer,
00010 // so that we can be woken up, and the buffer info (this replaces the
00011 // felix "socket" thread type, which was ugly.
00012 
00013 #include "demux_posix_demuxer.hpp"
00014 
00015 // a new sort of demuxer/event source: file io completions
00016 // haven't given up on using the socket style demuxers yet.
00017 #include "demux_pfileio.hpp"
00018 
00019 #include "demux_timer_queue.hpp"
00020 
00021 namespace flx { namespace faio {
00022 
00023 class FAIO_EXTERN socketio_wakeup : public demux::socket_wakeup {
00024 public:
00025   demux::sel_param   pb;     // in: what you want, out: what you get
00026   thread_wakeup fw;
00027 
00028   int       sio_flags;  // either one of PDEMUX_{READ|WRITE}
00029 
00030   virtual void wakeup(demux::posix_demuxer& demux);
00031 };
00032 
00033 // this can handle most unix style io, that is, read & write on sockets,
00034 // files & pipes. NICE. the fact that the socket is now in here may mean
00035 // I can get rid of the epoll hack
00036 // Not sure if this can be used for file fds.
00037 class FAIO_EXTERN socketio_request : public flx_driver_request_base {
00038 public:
00039     socketio_wakeup sv;
00040 
00041     socketio_request() {}       // Lord Felix demands it. Like STL.
00042 
00043     socketio_request(int s, char* buf, long len, bool r);
00044     virtual bool start_async_op(demux::demuxer& demux, flx_drv* drv,  void* f);
00045 };
00046 
00047 class FAIO_EXTERN connect_request
00048   : public flx_driver_request_base, public demux::connect_control_block {
00049 public:
00050   thread_wakeup fw;
00051 
00052   connect_request() {}      // flx linkage
00053 
00054   connect_request(const char* addr, int port) { addy = addr; p = port; s=-1; }
00055   virtual bool start_async_op(demux::demuxer& demux, flx_drv* drv,  void* f);
00056   virtual void wakeup(demux::posix_demuxer& demux);
00057 };
00058 
00059 class FAIO_EXTERN accept_request
00060   : public flx_driver_request_base, public demux::accept_control_block {
00061 public:
00062   // we sometimes know that there'll be several connections to accept.
00063   // this'll need a different wakeup - and a different interface between
00064   // event source & wakeups
00065   thread_wakeup fw;
00066 
00067   accept_request() {} // flx linkage
00068 
00069   // eeh, give that a better name
00070   accept_request(int listener) { s = listener; }
00071 
00072   // from flx_driver_request_base
00073   virtual bool start_async_op(demux::demuxer& demux, flx_drv* drv, void* f);
00074 
00075   // from accept_control_block
00076   virtual void wakeup(demux::posix_demuxer& demux);
00077 };
00078 
00079 
00080 // separate pthread file io
00081 // hum. multiple inheritance
00082 class FAIO_EXTERN flxfileio_request
00083     : public flx_driver_request_base, public demux::fileio_request
00084 {
00085     thread_wakeup   fw;
00086 public:
00087     flxfileio_request();           // flx linkage
00088     ~flxfileio_request();          // flx linkage
00089 
00090     flxfileio_request(int f, char* buf, long len, long off, bool rd)
00091         : fileio_request(f, buf, len, off, rd) {}
00092 
00093     // from driver request
00094     virtual bool start_async_op(demux::demuxer& demux, flx_drv* drv, void* f);
00095 
00096     // from async io thread
00097     virtual void finished();
00098 };
00099 
00100 }}
00101 #endif

Generated on Mon Dec 11 14:48:23 2006 for Felix by  doxygen 1.5.1