#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)
{
}
-template <class A, class B>
-ostringstream & operator<<(ostringstream &o, const pair<A,B> &d) {
- o << "<" << d.first << "," << d.second << ">";
- return o;
-}
-
-template <class A>
-marshall & operator<<(marshall &m, const list<A> &d) {
- m << vector<A>(d.begin(), d.end());
- return m;
+lock_state::lock_state(const lock_state &other) {
+ *this = other;
}
-template <class A>
-unmarshall & operator>>(unmarshall &u, list<A> &d) {
- vector<A> v;
- u >> v;
- d.assign(v.begin(), v.end());
- return u;
+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 <class A, class B>
-marshall & operator<<(marshall &m, const pair<A,B> &d) {
- m << d.first;
- m << d.second;
- return m;
-}
-
-template <class A, class B>
-unmarshall & operator>>(unmarshall &u, pair<A,B> &d) {
- u >> d.first;
- u >> d.second;
- return u;
+ostringstream & operator<<(ostringstream &o, const pair<A,B> &d) {
+ o << "<" << d.first << "," << d.second << ">";
+ return o;
}
marshall & operator<<(marshall &m, const lock_state &d) {
- m << d.held;
- m << d.held_by;
- m << d.wanted_by;
- return m;
+ return m << d.held << d.held_by << d.wanted_by;
}
unmarshall & operator>>(unmarshall &u, lock_state &d) {
- u >> d.held;
- u >> d.held_by;
- u >> d.wanted_by;
- return u;
+ return u >> d.held >> d.held_by >> d.wanted_by;
}
-
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);
}
lock_state &st = get_lock_state(lid);
holder held_by;
{
- ScopedLock sl(st.m);
+ lock sl(st.m);
held_by = st.held_by;
}
proxy = handle(held_by.first).safebind();
if (proxy) {
int r;
- rlock_protocol::status ret = proxy->call(rlock_protocol::revoke, lid, held_by.second, r);
+ rlock_protocol::status ret = proxy->call(rlock_protocol::revoke, r, lid, held_by.second);
LOG("Revoke returned " << ret);
}
}
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();
proxy = handle(front.first).safebind();
if (proxy) {
int r;
- ret = proxy->call(rlock_protocol::retry, lid, front.second, r);
+ ret = proxy->call(rlock_protocol::retry, r, lid, front.second);
LOG("Retry returned " << ret);
}
}
}
-int lock_server_cache_rsm::acquire(lock_protocol::lockid_t lid, string id, lock_protocol::xid_t xid, int &) {
+int lock_server_cache_rsm::acquire(int &r, lock_protocol::lockid_t lid, string id, lock_protocol::xid_t xid) {
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)) {
return lock_protocol::RETRY;
}
-int lock_server_cache_rsm::release(lock_protocol::lockid_t lid, callback id, lock_protocol::xid_t xid, int &r) {
+int lock_server_cache_rsm::release(int &r, lock_protocol::lockid_t lid, callback id, lock_protocol::xid_t xid) {
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");
}
string lock_server_cache_rsm::marshal_state() {
- ScopedLock sl(lock_table_lock);
+ lock sl(lock_table_lock);
marshall rep;
rep << nacquire;
rep << lock_table;
}
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;
}
-lock_protocol::status lock_server_cache_rsm::stat(lock_protocol::lockid_t lid, int &r) {
+lock_protocol::status lock_server_cache_rsm::stat(int &r, lock_protocol::lockid_t lid) {
printf("stat request\n");
r = nacquire;
return lock_protocol::OK;