X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/be7cf844f59fa483423724e8e4b5e663e5b88ddd..3abd3952c1f4441f0dd6eae9883b2d01ed9cd56b:/rpc/rpc.h diff --git a/rpc/rpc.h b/rpc/rpc.h index 065cabc..19ec96a 100644 --- a/rpc/rpc.h +++ b/rpc/rpc.h @@ -10,6 +10,11 @@ #include "marshall_wrap.h" #include "connection.h" +namespace rpc { + static constexpr milliseconds to_max{12000}; + static constexpr milliseconds to_min{100}; +} + class rpc_const { public: static const unsigned int bind = 1; // handler number reserved for bind @@ -26,7 +31,6 @@ class rpc_const { // manages a xid space per destination socket // threaded: multiple threads can be sending RPCs, class rpcc : public chanmgr { - private: //manages per rpc info @@ -66,52 +70,42 @@ class rpcc : public chanmgr { list xid_rep_window_; struct request { - request() { clear(); } void clear() { buf.clear(); xid = -1; } bool isvalid() { return xid != -1; } string buf; - int xid; + int xid = -1; }; - struct request dup_req_; + request dup_req_; int xid_rep_done_; + + int call1(proc_t proc, marshall &req, string &rep, milliseconds to); + + template + int call_m(proc_t proc, marshall &req, R & r, milliseconds to); public: rpcc(const string & d, bool retrans=true); ~rpcc(); - struct TO { - int to; - }; - static const TO to_max; - static const TO to_min; - static TO to(int x) { TO t; t.to = x; return t;} - unsigned int id() { return clt_nonce_; } - int bind(TO to = to_max); + int bind(milliseconds to = rpc::to_max); void set_reachable(bool r) { reachable_ = r; } void cancel(); - int islossy() { return lossytest_ > 0; } - - int call1(proc_t proc, marshall &req, string &rep, TO to); - bool got_pdu(connection *c, const string & b); - template - int call_m(proc_t proc, marshall &req, R & r, TO to); - template inline int call(proc_t proc, R & r, const Args&... args); template - inline int call_timeout(proc_t proc, TO to, R & r, const Args&... args); + inline int call_timeout(proc_t proc, milliseconds to, R & r, const Args&... args); }; template int -rpcc::call_m(proc_t proc, marshall &req, R & r, TO to) +rpcc::call_m(proc_t proc, marshall &req, R & r, milliseconds to) { string rep; int intret = call1(proc, req, rep, to); @@ -130,11 +124,11 @@ rpcc::call_m(proc_t proc, marshall &req, R & r, TO to) template inline int rpcc::call(proc_t proc, R & r, const Args&... args) { - return call_timeout(proc, rpcc::to_max, r, args...); + return call_timeout(proc, rpc::to_max, r, args...); } template inline int -rpcc::call_timeout(proc_t proc, const rpcc::TO to, R & r, const Args&... args) +rpcc::call_timeout(proc_t proc, const milliseconds to, R & r, const Args&... args) { marshall m{args...}; return call_m(proc, m, r, to); @@ -196,7 +190,7 @@ class rpcs : public chanmgr { mutex procs_m_; // protect insert/delete to procs[] mutex count_m_; //protect modification of counts mutex reply_window_m_; // protect reply window et al - mutex conss_m_; // protect conns_ + mutex conns_m_; // protect conns_ protected: @@ -224,17 +218,15 @@ class rpcs : public chanmgr { bool got_pdu(connection *c, const string & b); - template void reg(proc_t proc, F f, C *c=nullptr); -}; + struct ReturnOnFailure { + static inline int unmarshall_args_failure() { + return rpc_const::unmarshal_args_failure; + } + }; -struct ReturnOnFailure { - static inline int unmarshall_args_failure() { - return rpc_const::unmarshal_args_failure; + template void reg(proc_t proc, F f, C *c=nullptr) { + reg1(proc, marshalled_func::wrap(f, c)); } }; -template void rpcs::reg(proc_t proc, F f, C *c) { - reg1(proc, marshalled_func::wrap(f, c)); -} - #endif