a765e52050e8070f5d063de4018ebe2254b6d730
[invirt/third/libt4.git] / lock_server_cache_rsm.h
1 #ifndef lock_server_cache_rsm_h
2 #define lock_server_cache_rsm_h
3
4 #include <string>
5
6 #include <map>
7 #include <vector>
8 #include "lock_protocol.h"
9 #include "rpc/rpc.h"
10 #include "rsm_state_transfer.h"
11 #include "rsm.h"
12 #include "rpc/fifo.h"
13 #include "lock.h"
14
15 using std::string;
16 using std::pair;
17 using std::list;
18 using std::map;
19
20 typedef string callback;
21 typedef pair<callback, lock_protocol::xid_t> holder;
22
23 class lock_state {
24 public:
25     lock_state();
26     lock_state(const lock_state &other);
27     bool held;
28     holder held_by;
29     list<holder> wanted_by;
30     map<callback, lock_protocol::xid_t> old_requests;
31     mutex m;
32     lock_state& operator=(const lock_state&);
33 };
34
35 typedef map<lock_protocol::lockid_t, lock_state> lock_map;
36
37 class lock_server_cache_rsm : public rsm_state_transfer {
38     private:
39         int nacquire;
40         mutex lock_table_lock;
41         lock_map lock_table;
42         lock_state &get_lock_state(lock_protocol::lockid_t lid);
43         fifo<lock_protocol::lockid_t> retry_fifo;
44         fifo<lock_protocol::lockid_t> revoke_fifo;
45         class rsm *rsm;
46     public:
47         lock_server_cache_rsm(class rsm *rsm = 0);
48         lock_protocol::status stat(lock_protocol::lockid_t, int &);
49         void revoker();
50         void retryer();
51         string marshal_state();
52         void unmarshal_state(string state);
53         int acquire(lock_protocol::lockid_t, string id, lock_protocol::xid_t, int &);
54         int release(lock_protocol::lockid_t, string id, lock_protocol::xid_t, int &);
55 };
56
57 #endif