X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/b2609562b3d4fc548afcc0a3dfe4ff5fd4ae3d36..03b35a9a1bd1f583e32b27d260b223a0989d6c75:/handle.cc diff --git a/handle.cc b/handle.cc index 79b3b4c..926cb59 100644 --- a/handle.cc +++ b/handle.cc @@ -5,18 +5,18 @@ public: unique_ptr client; bool valid = true; string destination; - mutex client_mutex; + std::mutex client_mutex; hinfo(const string & destination_) : destination(destination_) {} }; -static mutex mgr_mutex; -static map> hmap; +static std::mutex mgr_mutex; +static std::map> hmap; -handle::handle(const string & destination) { +handle::handle(const string & destination) : destination_(destination) { lock ml(mgr_mutex); h = hmap[destination]; if (!h || !h->valid) - h = (hmap[destination] = make_shared(destination)); + h = (hmap[destination] = std::make_shared(destination)); } rpcc * handle::safebind() { @@ -27,44 +27,25 @@ rpcc * handle::safebind() { return nullptr; if (!h->client) { unique_ptr client(new rpcc(h->destination)); - LOG("trying to bind..." << h->destination); - // The test script assumes that the failure can be detected by paxos and - // rsm layer within few seconds. We have to set the timeout with a small - // value to support the assumption. - // - // With RPC_LOSSY=5, tests may fail due to delays and time outs. + LOG << "bind(\"" << h->destination << "\")"; int ret = client->bind(milliseconds(1000)); if (ret < 0) { - LOG("bind failure! " << h->destination << " " << ret); + LOG << "bind failure! " << h->destination << " " << ret; h->valid = false; } else { - LOG("bind succeeded " << h->destination); - h->client = move(client); + LOG << "bind succeeded " << h->destination; + h->client = std::move(client); } } return h->client.get(); } void handle::invalidate() { - { - lock cl(h->client_mutex); - h->valid = false; - - LOG_NONMEMBER("cl " << h->destination << " refcnt " << h.use_count()); - } - lock ml(mgr_mutex); - hmap.erase(h->destination); - h = nullptr; -} - -void invalidate_handle(const string & m) { + h.reset(); lock ml(mgr_mutex); - if (hmap.find(m) == hmap.end()) { - LOG_NONMEMBER("cl " << m << " isn't in cl list"); - return; + if (hmap.find(destination_) != hmap.end()) { + hmap[destination_]->valid = false; + LOG << "cl " << destination_ << " refcnt " << hmap[destination_].use_count(); + hmap.erase(destination_); } - - hmap[m]->valid = false; - LOG_NONMEMBER("cl " << m << " refcnt " << hmap[m].use_count()); - hmap.erase(m); }