X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a4175b2e216a20b86cc872dea8a08005c60617a5..eeab3e6cade87c1fe0a5f3d93522e12ccb9ec2ab:/lock_server.h diff --git a/lock_server.h b/lock_server.h index f03a717..2aa8445 100644 --- a/lock_server.h +++ b/lock_server.h @@ -1,34 +1,57 @@ -// this is the lock server -// the lock client has a similar interface - #ifndef lock_server_h #define lock_server_h #include + +#include +#include #include "lock_protocol.h" -#include "lock_client.h" #include "rpc/rpc.h" -#include -#include - +#include "rsm_state_transfer.h" +#include "rsm.h" +#include "rpc/fifo.h" +#include "lock.h" + +using std::string; +using std::pair; +using std::list; using std::map; -typedef map lock_map; - -class lock_server { - - protected: - int nacquire; - mutex lock_lock; - lock_map locks; - mutex &get_lock(lock_protocol::lockid_t lid); +typedef string callback; +typedef pair holder; + +class lock_state { +public: + lock_state(); + lock_state(const lock_state &other); + bool held; + holder held_by; + list wanted_by; + map old_requests; + mutex m; + lock_state& operator=(const lock_state&); +}; - 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 &); +typedef map 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 retry_fifo; + fifo revoke_fifo; + class rsm *rsm; + public: + lock_server(class rsm *rsm = 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