X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/61809b48ade4c21b1b01931d520aa2abc7507032..a4175b2e216a20b86cc872dea8a08005c60617a5:/rsm_client.cc diff --git a/rsm_client.cc b/rsm_client.cc index 69fec20..9beb0b3 100644 --- a/rsm_client.cc +++ b/rsm_client.cc @@ -5,19 +5,18 @@ #include #include #include "lang/verify.h" - +#include "lock.h" rsm_client::rsm_client(std::string dst) { printf("create rsm_client\n"); std::vector mems; - pthread_mutex_init(&rsm_client_mutex, NULL); sockaddr_in dstsock; make_sockaddr(dst.c_str(), &dstsock); primary = dst; { - ScopedLock ml(&rsm_client_mutex); + lock ml(rsm_client_mutex); VERIFY (init_members()); } printf("rsm_client: done\n"); @@ -31,16 +30,16 @@ void rsm_client::primary_failure() { rsm_protocol::status rsm_client::invoke(int proc, std::string req, std::string &rep) { int ret; - ScopedLock ml(&rsm_client_mutex); + lock ml(rsm_client_mutex); while (1) { printf("rsm_client::invoke proc %x primary %s\n", proc, primary.c_str()); handle h(primary); - VERIFY(pthread_mutex_unlock(&rsm_client_mutex)==0); + ml.unlock(); rpcc *cl = h.safebind(); if (cl) ret = cl->call(rsm_client_protocol::invoke, proc, req, rep, rpcc::to(5000)); - VERIFY(pthread_mutex_lock(&rsm_client_mutex)==0); + ml.lock(); if (!cl) goto prim_fail; @@ -71,14 +70,18 @@ prim_fail: bool rsm_client::init_members() { printf("rsm_client::init_members get members!\n"); handle h(primary); - VERIFY(pthread_mutex_unlock(&rsm_client_mutex)==0); int ret; - rpcc *cl = h.safebind(); - if (cl) { - ret = cl->call(rsm_client_protocol::members, 0, known_mems, - rpcc::to(1000)); + rpcc *cl; + { + adopt_lock ml(rsm_client_mutex); + ml.unlock(); + cl = h.safebind(); + if (cl) { + ret = cl->call(rsm_client_protocol::members, 0, known_mems, + rpcc::to(1000)); + } + ml.lock(); } - VERIFY(pthread_mutex_lock(&rsm_client_mutex)==0); if (cl == 0 || ret != rsm_protocol::OK) return false; if (known_mems.size() < 1) {