X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a4175b2e216a20b86cc872dea8a08005c60617a5..5d99dbf06a14904944f5593c63705934bdfdcfb7:/lock_server.h diff --git a/lock_server.h b/lock_server.h index f03a717..5c182e0 100644 --- a/lock_server.h +++ b/lock_server.h @@ -1,34 +1,50 @@ -// this is the lock server -// the lock client has a similar interface - #ifndef lock_server_h #define lock_server_h -#include +#include "types.h" #include "lock_protocol.h" -#include "lock_client.h" -#include "rpc/rpc.h" -#include -#include - -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); +#include "rsm.h" +#include "rpc/fifo.h" + +typedef string callback_t; +typedef pair holder_t; + +class lock_state { +public: + lock_state(); + lock_state(const lock_state &other); + bool held; + holder_t held_by; + list wanted_by; + map 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_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