X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a4175b2e216a20b86cc872dea8a08005c60617a5..eb3d5c6416c0f0d1cad35e52af3231de7866fea8:/lock_server.h diff --git a/lock_server.h b/lock_server.h index f03a717..1f30f87 100644 --- a/lock_server.h +++ b/lock_server.h @@ -1,34 +1,49 @@ -// 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 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_STRUCT(lock_state) + +typedef map lock_map; + +class lock_server : private 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; + rsm *rsm_; + string marshal_state(); + void unmarshal_state(const string & state); + void revoker NORETURN (); + void retryer NORETURN (); + public: + lock_server(rsm & r); + lock_protocol::status acquire(int &, lock_protocol::lockid_t, const callback_t & id, lock_protocol::xid_t); + lock_protocol::status release(int &, lock_protocol::lockid_t, const callback_t & id, lock_protocol::xid_t); + lock_protocol::status stat(int &, lock_protocol::lockid_t, const callback_t & id); }; #endif