Imported from 6.824 labs
[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.h"
10 #include "mutex.h"
11 #include "rsm_state_transfer.h"
12 #include "rsm.h"
13 #include "rpc/fifo.h"
14
15 using namespace std;
16
17 typedef string callback;
18 typedef pair<callback, lock_protocol::xid_t> holder;
19
20 class lock_state {
21 public:
22     lock_state();
23     bool held;
24     holder held_by;
25     list<holder> wanted_by;
26     map<callback, lock_protocol::xid_t> old_requests;
27     mutex m;
28 };
29
30 typedef map<lock_protocol::lockid_t, lock_state> lock_map;
31
32 class lock_server_cache_rsm : public rsm_state_transfer {
33     private:
34         int nacquire;
35         mutex lock_table_lock;
36         lock_map lock_table;
37         lock_state &get_lock_state(lock_protocol::lockid_t lid);
38         fifo<lock_protocol::lockid_t> retry_fifo;
39         fifo<lock_protocol::lockid_t> revoke_fifo;
40         class rsm *rsm;
41     public:
42         lock_server_cache_rsm(class rsm *rsm = 0);
43         lock_protocol::status stat(lock_protocol::lockid_t, int &);
44         void revoker();
45         void retryer();
46         string marshal_state();
47         void unmarshal_state(string state);
48         int acquire(lock_protocol::lockid_t, string id, lock_protocol::xid_t, int &);
49         int release(lock_protocol::lockid_t, string id, lock_protocol::xid_t, int &);
50 };
51
52 #endif