-// this is the lock server
-// the lock client has a similar interface
-
#ifndef lock_server_h
#define lock_server_h
-#include <string>
+#include "types.h"
#include "lock_protocol.h"
-#include "lock_client.h"
-#include "rpc/rpc.h"
-#include <list>
-#include <map>
-
-using std::map;
-
-typedef map<lock_protocol::lockid_t, mutex> lock_map;
-
-class lock_server {
-
- protected:
- int nacquire;
- mutex lock_lock;
- lock_map locks;
- mutex &get_lock(lock_protocol::lockid_t lid);
+#include "rsm.h"
+#include "rpc/fifo.h"
+
+typedef string callback_t;
+typedef pair<callback_t, lock_protocol::xid_t> holder_t;
+
+class lock_state {
+public:
+ lock_state();
+ lock_state(const lock_state &other);
+ bool held;
+ holder_t held_by;
+ list<holder_t> wanted_by;
+ map<callback_t, lock_protocol::xid_t> old_requests;
+ mutex m;
+ lock_state& operator=(const lock_state&);
+
+ MEMBERS(held, held_by, wanted_by)
+};
- public:
- lock_server();
- ~lock_server() {};
- lock_protocol::status stat(int clt, lock_protocol::lockid_t lid, int &);
- lock_protocol::status acquire(int clt, lock_protocol::lockid_t lid, int &);
- lock_protocol::status release(int clt, lock_protocol::lockid_t lid, int &);
+MARSHALLABLE(lock_state)
+
+typedef map<lock_protocol::lockid_t, lock_state> lock_map;
+
+class lock_server : public rsm_state_transfer {
+ private:
+ int nacquire;
+ mutex lock_table_lock;
+ lock_map lock_table;
+ lock_state &get_lock_state(lock_protocol::lockid_t lid);
+ fifo<lock_protocol::lockid_t> retry_fifo;
+ fifo<lock_protocol::lockid_t> revoke_fifo;
+ rsm *rsm_;
+ public:
+ lock_server(rsm *r = 0);
+ lock_protocol::status stat(int &, lock_protocol::lockid_t);
+ void revoker();
+ void retryer();
+ string marshal_state();
+ void unmarshal_state(string state);
+ int acquire(int &, lock_protocol::lockid_t, string id, lock_protocol::xid_t);
+ int release(int &, lock_protocol::lockid_t, string id, lock_protocol::xid_t);
};
#endif