X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/03b35a9a1bd1f583e32b27d260b223a0989d6c75..c279db4240a3a3c30f069ab9dea8055cf94280da:/rpc/rpc.h?ds=sidebyside diff --git a/rpc/rpc.h b/rpc/rpc.h index 58e9381..df5d89e 100644 --- a/rpc/rpc.h +++ b/rpc/rpc.h @@ -2,14 +2,13 @@ #define rpc_h #include "types.h" -#include -#include #include "rpc_protocol.h" -#include "thr_pool.h" +#include "thread_pool.h" #include "marshall.h" #include "marshall_wrap.h" #include "connection.h" +#include "threaded_log.h" using std::chrono::milliseconds; @@ -75,6 +74,7 @@ class rpcc : private connection_delegate { std::mutex m_; // protect insert/delete to calls[] std::mutex chan_m_; + std::mutex bind_m_; // protect bind operations bool destroy_wait_ = false; cond destroy_wait_c_; @@ -122,9 +122,17 @@ class rpcc : private connection_delegate { int bind(milliseconds to = rpc::to_max); + // Manages a cache of RPC connections. Usage: + // if (auto cl = rpcc::bind_cached(dst)) + // ret = cl->call(...); + // where the string dst has the form "host:port". Because bind_cached() + // may block, callers should probably not hold mutexes. + static shared_ptr bind_cached(const string & destination); + static void unbind_cached(const string & destination); + void set_reachable(bool r) { reachable_ = r; } - void cancel(); + void cancel(lock & m_lock); template inline int call(proc_t

proc, R & r, const Args & ... args) { @@ -193,7 +201,7 @@ class rpcs : private connection_delegate { void dispatch(shared_ptr c, const string & buf); - unique_ptr dispatchpool_{new thread_pool(6, false)}; + unique_ptr dispatchpool_{new thread_pool(6)}; unique_ptr listener_; // RPC handler for clients binding