X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/24bebc0ecf83446c7371eff69042322aab34976a..3615d9bf0b254442e2fddee45475dbd634cf703a:/rpc/connection.h?ds=sidebyside diff --git a/rpc/connection.h b/rpc/connection.h index 2a01e46..7032b8c 100644 --- a/rpc/connection.h +++ b/rpc/connection.h @@ -5,8 +5,8 @@ #include #include #include -#include #include "pollmgr.h" +#include "file.h" constexpr size_t size_t_max = numeric_limits::max(); @@ -16,43 +16,37 @@ class connection; class chanmgr { public: - virtual bool got_pdu(connection *c, char *b, size_t sz) = 0; + virtual bool got_pdu(const shared_ptr & c, const string & b) = 0; virtual ~chanmgr() {} }; -class connection : public aio_callback { +class connection : public aio_callback, public enable_shared_from_this { public: struct charbuf { - charbuf(): buf(NULL), sz(0), solong(0) {} - charbuf (char *b, size_t s) : buf(b), sz(s), solong(0){} - char *buf; - size_t sz; - size_t solong; // number of bytes written or read so far + string buf; + size_t solong = 0; // number of bytes written or read so far }; connection(chanmgr *m1, int f1, int lossytest=0); ~connection(); int channo() { return fd_; } - bool isdead(); + bool isdead() { lock ml(m_); return dead_; } void closeconn(); - bool send(char *b, size_t sz); + bool send(const string & b); void write_cb(int s); void read_cb(int s); - void incref(); - void decref(); - int ref() { lock rl(ref_m_); return refno_; } + time_point create_time() const { return create_time_; } - int compare(connection *another); private: bool readpdu(); bool writepdu(); chanmgr *mgr_; - const int fd_; + const file_t fd_; bool dead_ = false; charbuf wpdu_; @@ -61,31 +55,29 @@ class connection : public aio_callback { time_point create_time_; int waiters_ = 0; - int refno_ = 1; - const int lossy_; + int lossy_ = 0; mutex m_; - mutex ref_m_; cond send_complete_; cond send_wait_; }; class tcpsconn { public: - tcpsconn(chanmgr *m1, unsigned int port, int lossytest=0); + tcpsconn(chanmgr *m1, in_port_t port, int lossytest=0); ~tcpsconn(); - inline unsigned int port() { return port_; } + inline in_port_t port() { return port_; } void accept_conn(); private: - unsigned int port_; + in_port_t port_; mutex m_; thread th_; - int pipe_[2]; + file_t pipe_[2]; - int tcp_; //file desciptor for accepting connection + socket_t tcp_; // listens for connections chanmgr *mgr_; int lossy_; - map conns_; + map> conns_; void process_accept(); }; @@ -97,5 +89,5 @@ struct bundle { int lossy; }; -connection *connect_to_dst(const sockaddr_in &dst, chanmgr *mgr, int lossy=0); +shared_ptr connect_to_dst(const sockaddr_in &dst, chanmgr *mgr, int lossy=0); #endif