Actually, you know, build.
[invirt/third/libt4.git] / lock_server_cache_rsm.cc
index 5149049..8f3cf2b 100644 (file)
@@ -9,85 +9,53 @@
 #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);
 }
 
@@ -102,7 +70,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;
         }
 
@@ -113,7 +81,7 @@ void lock_server_cache_rsm::revoker() {
         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);
         }
     }
@@ -130,7 +98,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();
@@ -145,17 +113,17 @@ void lock_server_cache_rsm::retryer() {
         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)) {
@@ -209,10 +177,10 @@ int lock_server_cache_rsm::acquire(lock_protocol::lockid_t lid, string id, lock_
     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");
@@ -223,7 +191,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,13 +199,13 @@ 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;
 }
 
-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;