X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a5f10a497bebfc680bf418193f1fd9f1ad7cc417..4e881433f37417ccbda89c09ffdf936855d462d4:/rsm.h diff --git a/rsm.h b/rsm.h index 1e1726d..14dc011 100644 --- a/rsm.h +++ b/rsm.h @@ -18,10 +18,10 @@ class rsm_state_transfer { class rsm : public config_view_change { private: - void reg1(int proc, handler *); + void reg1(rpc_protocol::proc_id_t proc, handler *); protected: - map procs; - config *cfg; + map procs; + unique_ptr cfg; rsm_state_transfer *stf = nullptr; rpcs *rsmrpc; // On slave: expected viewstamp of next invoke request @@ -36,14 +36,14 @@ class rsm : public config_view_change { vector backups; // A list of unsynchronized backups // For testing purposes - rpcs *testsvr; + unique_ptr testsvr; bool partitioned; bool dopartition; bool break1; bool break2; rsm_client_protocol::status client_members(vector &r, int i); - rsm_protocol::status invoke(int &, int proc, viewstamp vs, const string & mreq); + rsm_protocol::status invoke(int &, rpc_protocol::proc_id_t proc, viewstamp vs, const string & mreq); rsm_protocol::status transferreq(rsm_protocol::transferres &r, const string & src, viewstamp last, unsigned vid); rsm_protocol::status transferdonereq(int &, const string & m, unsigned vid); @@ -54,8 +54,8 @@ class rsm : public config_view_change { mutex rsm_mutex, invoke_mutex; cond recovery_cond, sync_cond; - void execute(int procno, const string & req, string & r); - rsm_client_protocol::status client_invoke(string & r, int procno, const string & req); + void execute(rpc_protocol::proc_id_t procno, const string & req, string & r); + rsm_client_protocol::status client_invoke(string & r, rpc_protocol::proc_id_t procno, const string & req); bool statetransfer(const string & m, lock & rsm_mutex_lock); bool statetransferdone(const string & m, lock & rsm_mutex_lock); bool join(const string & m, lock & rsm_mutex_lock); @@ -72,14 +72,15 @@ class rsm : public config_view_change { bool amiprimary(); void set_state_transfer(rsm_state_transfer *_stf) { stf = _stf; } - void recovery(); + void recovery NORETURN (); void commit_change(unsigned vid); - template void reg(int proc, F f, C *c=nullptr); -}; + template void reg(rpc_protocol::proc_t

proc, F f, C *c=nullptr) { + static_assert(is_valid_registration::value, "RSM handler registered with incorrect argument types"); + reg1(proc.id, marshalled_func::wrap(f, c)); + } -template void rsm::reg(int proc, F f, C *c) { - reg1(proc, marshalled_func::wrap(f, c)); -} + void start(); +}; #endif /* rsm_h */