00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef Rdma_Acceptor_h
00022 #define Rdma_Acceptor_h
00023
00024 #include "rdma_wrap.h"
00025
00026 #include "qpid/sys/Dispatcher.h"
00027 #include "qpid/sys/Mutex.h"
00028
00029 #include <netinet/in.h>
00030
00031 #include <boost/function.hpp>
00032 #include <boost/ptr_container/ptr_deque.hpp>
00033 #include <deque>
00034
00035 using qpid::sys::DispatchHandle;
00036 using qpid::sys::Poller;
00037
00038 namespace Rdma {
00039
00040 class Connection;
00041
00042 typedef boost::function1<void, Rdma::Connection::intrusive_ptr&> ConnectedCallback;
00043 typedef boost::function1<void, Rdma::Connection::intrusive_ptr&> ErrorCallback;
00044 typedef boost::function1<void, Rdma::Connection::intrusive_ptr&> DisconnectedCallback;
00045 typedef boost::function1<bool, Rdma::Connection::intrusive_ptr&> ConnectionRequestCallback;
00046 typedef boost::function1<void, Rdma::Connection::intrusive_ptr&> RejectedCallback;
00047
00048 class AsynchIO
00049 {
00050 typedef boost::function1<void, AsynchIO&> ErrorCallback;
00051 typedef boost::function2<void, AsynchIO&, Buffer*> ReadCallback;
00052 typedef boost::function1<void, AsynchIO&> IdleCallback;
00053 typedef boost::function1<void, AsynchIO&> FullCallback;
00054
00055 QueuePair::intrusive_ptr qp;
00056 DispatchHandle dataHandle;
00057 int bufferSize;
00058 int recvBufferCount;
00059 int xmitBufferCount;
00060 int outstandingWrites;
00061 std::deque<Buffer*> bufferQueue;
00062 qpid::sys::Mutex bufferQueueLock;
00063 boost::ptr_deque<Buffer> buffers;
00064
00065 ReadCallback readCallback;
00066 IdleCallback idleCallback;
00067 FullCallback fullCallback;
00068 ErrorCallback errorCallback;
00069
00070 public:
00071 AsynchIO(
00072 QueuePair::intrusive_ptr q,
00073 int s,
00074 ReadCallback rc,
00075 IdleCallback ic,
00076 FullCallback fc,
00077 ErrorCallback ec
00078 );
00079 ~AsynchIO();
00080
00081 void start(Poller::shared_ptr poller);
00082 void queueWrite(Buffer* buff);
00083 void notifyPendingWrite();
00084 void queueWriteClose();
00085 Buffer* getBuffer();
00086
00087 private:
00088 void dataEvent(DispatchHandle& handle);
00089 };
00090
00091 class Listener
00092 {
00093 sockaddr src_addr;
00094 Connection::intrusive_ptr ci;
00095 DispatchHandle handle;
00096 ConnectedCallback connectedCallback;
00097 ErrorCallback errorCallback;
00098 DisconnectedCallback disconnectedCallback;
00099 ConnectionRequestCallback connectionRequestCallback;
00100
00101 public:
00102 Listener(
00103 const sockaddr& src,
00104 ConnectedCallback cc,
00105 ErrorCallback errc,
00106 DisconnectedCallback dc,
00107 ConnectionRequestCallback crc = 0
00108 );
00109 void start(Poller::shared_ptr poller);
00110
00111 private:
00112 void connectionEvent(DispatchHandle& handle);
00113 };
00114
00115 class Connector
00116 {
00117 sockaddr dst_addr;
00118 Connection::intrusive_ptr ci;
00119 DispatchHandle handle;
00120 ConnectedCallback connectedCallback;
00121 ErrorCallback errorCallback;
00122 DisconnectedCallback disconnectedCallback;
00123 RejectedCallback rejectedCallback;
00124
00125 public:
00126 Connector(
00127 const sockaddr& dst,
00128 ConnectedCallback cc,
00129 ErrorCallback errc,
00130 DisconnectedCallback dc,
00131 RejectedCallback rc = 0
00132 );
00133 void start(Poller::shared_ptr poller);
00134
00135 private:
00136 void connectionEvent(DispatchHandle& handle);
00137 };
00138 }
00139
00140 #endif // Rdma_Acceptor_h