X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a5f10a497bebfc680bf418193f1fd9f1ad7cc417..f0dcb6b97d6d40f67698d1f71ac26970f1776f82:/lock_server.cc diff --git a/lock_server.cc b/lock_server.cc index d7367bd..90ad5b2 100644 --- a/lock_server.cc +++ b/lock_server.cc @@ -1,6 +1,5 @@ // the caching lock server implementation -#include "types.h" #include "lock_server.h" #include #include @@ -11,11 +10,11 @@ lock_state::lock_state(): { } -lock_state::lock_state(const lock_state &other) { +lock_state::lock_state(const lock_state & other) { *this = other; } -lock_state& lock_state::operator=(const lock_state& o) { +lock_state & lock_state::operator=(const lock_state & o) { held = o.held; held_by = o.held_by; wanted_by = o.wanted_by; @@ -29,13 +28,17 @@ lock_state & lock_server::get_lock_state(lock_protocol::lockid_t lid) { return lock_table[lid]; } -lock_server::lock_server(rsm *r) : rsm_ (r) { +lock_server::lock_server(rsm & r) : rsm_ (&r) { thread(&lock_server::revoker, this).detach(); thread(&lock_server::retryer, this).detach(); - rsm_->set_state_transfer(this); + r.set_state_transfer(this); + + r.reg(lock_protocol::acquire, &lock_server::acquire, this); + r.reg(lock_protocol::release, &lock_server::release, this); + r.reg(lock_protocol::stat, &lock_server::stat, this); } -void lock_server::revoker() [[noreturn]] { +void lock_server::revoker () { while (1) { lock_protocol::lockid_t lid; revoke_fifo.deq(&lid); @@ -43,7 +46,7 @@ void lock_server::revoker() [[noreturn]] { if (rsm_ && !rsm_->amiprimary()) continue; - lock_state &st = get_lock_state(lid); + lock_state & st = get_lock_state(lid); holder_t held_by; { lock sl(st.m); @@ -63,7 +66,7 @@ void lock_server::revoker() [[noreturn]] { } } -void lock_server::retryer() [[noreturn]] { +void lock_server::retryer() { while (1) { lock_protocol::lockid_t lid; retry_fifo.deq(&lid); @@ -71,7 +74,7 @@ void lock_server::retryer() [[noreturn]] { continue; LOG("Sending retry for " << lid); - lock_state &st = get_lock_state(lid); + lock_state & st = get_lock_state(lid); holder_t front; { lock sl(st.m); @@ -93,10 +96,10 @@ void lock_server::retryer() [[noreturn]] { } } -int lock_server::acquire(int &, lock_protocol::lockid_t lid, const callback_t & id, lock_protocol::xid_t xid) { +lock_protocol::status lock_server::acquire(int &, lock_protocol::lockid_t lid, const callback_t & id, lock_protocol::xid_t xid) { LOG("lid=" << lid << " client=" << id << "," << xid); holder_t h = holder_t(id, xid); - lock_state &st = get_lock_state(lid); + lock_state & st = get_lock_state(lid); lock sl(st.m); // deal with duplicated requests @@ -151,9 +154,9 @@ int lock_server::acquire(int &, lock_protocol::lockid_t lid, const callback_t & return lock_protocol::RETRY; } -int lock_server::release(int &, lock_protocol::lockid_t lid, const callback_t & id, lock_protocol::xid_t xid) { +lock_protocol::status lock_server::release(int &, lock_protocol::lockid_t lid, const callback_t & id, lock_protocol::xid_t xid) { LOG("lid=" << lid << " client=" << id << "," << xid); - lock_state &st = get_lock_state(lid); + lock_state & st = get_lock_state(lid); lock sl(st.m); if (st.held && st.held_by == holder_t(id, xid)) { st.held = false; @@ -166,18 +169,15 @@ int lock_server::release(int &, lock_protocol::lockid_t lid, const callback_t & string lock_server::marshal_state() { lock sl(lock_table_lock); - marshall rep; - rep << nacquire << lock_table; - return rep.content(); + return marshall(nacquire, lock_table).content(); } void lock_server::unmarshal_state(const string & state) { lock sl(lock_table_lock); - unmarshall rep(state, false); - rep >> nacquire >> lock_table; + unmarshall(state, false, nacquire, lock_table); } -lock_protocol::status lock_server::stat(int &r, lock_protocol::lockid_t lid) { +lock_protocol::status lock_server::stat(int & r, lock_protocol::lockid_t lid, const callback_t &) { LOG("stat request for " << lid); VERIFY(0); r = nacquire;