X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/5fd8cc8409d0efadc07dfe8d6774ad9ff477663d..a4175b2e216a20b86cc872dea8a08005c60617a5:/lock_server_cache_rsm.cc diff --git a/lock_server_cache_rsm.cc b/lock_server_cache_rsm.cc index 5149049..c3f75e8 100644 --- a/lock_server_cache_rsm.cc +++ b/lock_server_cache_rsm.cc @@ -9,12 +9,25 @@ #include "handle.h" #include "tprintf.h" #include "rpc/marshall.h" +#include "lock.h" + +using std::ostringstream; +using std::istringstream; +using std::vector; lock_state::lock_state(): held(false) { } +lock_state& lock_state::operator=(const lock_state& o) { + held = o.held; + held_by = o.held_by; + wanted_by = o.wanted_by; + old_requests = o.old_requests; + return *this; +} + template ostringstream & operator<<(ostringstream &o, const pair &d) { o << "<" << d.first << "," << d.second << ">"; @@ -66,28 +79,15 @@ unmarshall & operator>>(unmarshall &u, lock_state &d) { lock_state & lock_server_cache_rsm::get_lock_state(lock_protocol::lockid_t lid) { - ScopedLock sl(lock_table_lock); + lock sl(lock_table_lock); // by the semantics of map, this will create // the lock if it doesn't already exist return lock_table[lid]; } -static void *revokethread(void *x) { - lock_server_cache_rsm *sc = (lock_server_cache_rsm *) x; - sc->revoker(); - return 0; -} - -static void *retrythread(void *x) { - lock_server_cache_rsm *sc = (lock_server_cache_rsm *) x; - sc->retryer(); - return 0; -} - lock_server_cache_rsm::lock_server_cache_rsm(class rsm *_rsm) : rsm (_rsm) { - pthread_t th; - VERIFY(pthread_create(&th, NULL, &revokethread, (void *)this) == 0); - VERIFY(pthread_create(&th, NULL, &retrythread, (void *)this) == 0); + std::thread(&lock_server_cache_rsm::revoker, this).detach(); + std::thread(&lock_server_cache_rsm::retryer, this).detach(); rsm->set_state_transfer(this); } @@ -102,7 +102,7 @@ void lock_server_cache_rsm::revoker() { lock_state &st = get_lock_state(lid); holder held_by; { - ScopedLock sl(st.m); + lock sl(st.m); held_by = st.held_by; } @@ -130,7 +130,7 @@ void lock_server_cache_rsm::retryer() { lock_state &st = get_lock_state(lid); holder front; { - ScopedLock sl(st.m); + lock sl(st.m); if (st.wanted_by.empty()) continue; front = st.wanted_by.front(); @@ -155,7 +155,7 @@ int lock_server_cache_rsm::acquire(lock_protocol::lockid_t lid, string id, lock_ LOG_FUNC_ENTER_SERVER; holder h = holder(id, xid); lock_state &st = get_lock_state(lid); - ScopedLock sl(st.m); + lock sl(st.m); // deal with duplicated requests if (st.old_requests.count(id)) { @@ -212,7 +212,7 @@ int lock_server_cache_rsm::acquire(lock_protocol::lockid_t lid, string id, lock_ int lock_server_cache_rsm::release(lock_protocol::lockid_t lid, callback id, lock_protocol::xid_t xid, int &r) { LOG_FUNC_ENTER_SERVER; lock_state &st = get_lock_state(lid); - ScopedLock sl(st.m); + lock sl(st.m); if (st.held && st.held_by == holder(id, xid)) { st.held = false; LOG("Lock " << lid << " not held"); @@ -223,7 +223,7 @@ int lock_server_cache_rsm::release(lock_protocol::lockid_t lid, callback id, loc } string lock_server_cache_rsm::marshal_state() { - ScopedLock sl(lock_table_lock); + lock sl(lock_table_lock); marshall rep; rep << nacquire; rep << lock_table; @@ -231,7 +231,7 @@ string lock_server_cache_rsm::marshal_state() { } void lock_server_cache_rsm::unmarshal_state(string state) { - ScopedLock sl(lock_table_lock); + lock sl(lock_table_lock); unmarshall rep(state); rep >> nacquire; rep >> lock_table;