All sleep calls via std::this_thread
[invirt/third/libt4.git] / lock_server.h
1 #ifndef lock_server_h
2 #define lock_server_h
3
4 #include "types.h"
5 #include "lock_protocol.h"
6 #include "rsm.h"
7 #include "rpc/fifo.h"
8
9 typedef std::pair<callback_t, lock_protocol::xid_t> holder_t;
10
11 class lock_state {
12 public:
13     lock_state();
14     lock_state(const lock_state & other);
15     bool held;
16     holder_t held_by;
17     std::list<holder_t> wanted_by;
18     std::map<callback_t, lock_protocol::xid_t> old_requests;
19     std::mutex m;
20     lock_state & operator=(const lock_state &);
21
22     MEMBERS(held, held_by, wanted_by)
23 };
24
25 typedef std::map<lock_protocol::lockid_t, lock_state> lock_map;
26
27 class lock_server : private rsm_state_transfer {
28     private:
29         int nacquire;
30         std::mutex lock_table_lock;
31         lock_map lock_table;
32         lock_state & get_lock_state(lock_protocol::lockid_t lid);
33         fifo<lock_protocol::lockid_t> retry_fifo;
34         fifo<lock_protocol::lockid_t> revoke_fifo;
35         rsm *rsm_;
36         string marshal_state();
37         void unmarshal_state(const string & state);
38         void revoker NORETURN ();
39         void retryer NORETURN ();
40     public:
41         lock_server(rsm & r);
42         lock_protocol::status acquire(int &, lock_protocol::lockid_t, const callback_t & id, lock_protocol::xid_t);
43         lock_protocol::status release(int &, lock_protocol::lockid_t, const callback_t & id, lock_protocol::xid_t);
44         lock_protocol::status stat(int &, lock_protocol::lockid_t, const callback_t & id);
45 };
46
47 #endif