X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/2546a41ad36fdc9ef6471cb35a1d56930ae1b527..f0dcb6b97d6d40f67698d1f71ac26970f1776f82:/paxos_protocol.h?ds=sidebyside diff --git a/paxos_protocol.h b/paxos_protocol.h index f2bdb3f..c61e2eb 100644 --- a/paxos_protocol.h +++ b/paxos_protocol.h @@ -1,85 +1,40 @@ #ifndef paxos_protocol_h #define paxos_protocol_h +#include "types.h" #include "rpc/rpc.h" struct prop_t { unsigned n; - std::string m; -}; - -class paxos_protocol { - public: - enum status : status_t { OK, ERR }; - enum rpc_numbers : proc_t { - preparereq = 0x11001, - acceptreq, - decidereq, - heartbeat, - }; - - struct preparearg { - unsigned instance; - prop_t n; - }; - - struct prepareres { - bool oldinstance; - bool accept; - prop_t n_a; - std::string v_a; - }; + string m; - struct acceptarg { - unsigned instance; - prop_t n; - std::string v; - }; - - struct decidearg { - unsigned instance; - std::string v; - }; + MEMBERS(n, m) + LEXICOGRAPHIC_COMPARISON(prop_t) }; -inline unmarshall & operator>>(unmarshall &u, prop_t &a) { - return u >> a.n >> a.m; -} - -inline marshall & operator<<(marshall &m, prop_t a) { - return m << a.n << a.m; -} - -inline unmarshall & operator>>(unmarshall &u, paxos_protocol::preparearg &a) { - return u >> a.instance >> a.n; -} - -inline marshall & operator<<(marshall &m, paxos_protocol::preparearg a) { - return m << a.instance << a.n; -} - -inline unmarshall & operator>>(unmarshall &u, paxos_protocol::prepareres &r) { - return u >> r.oldinstance >> r.accept >> r.n_a >> r.v_a; -} - -inline marshall & operator<<(marshall &m, paxos_protocol::prepareres r) { - return m << r.oldinstance << r.accept << r.n_a << r.v_a; -} - -inline unmarshall & operator>>(unmarshall &u, paxos_protocol::acceptarg &a) { - return u >> a.instance >> a.n >> a.v; -} - -inline marshall & operator<<(marshall &m, paxos_protocol::acceptarg a) { - return m << a.instance << a.n << a.v; -} - -inline unmarshall & operator>>(unmarshall &u, paxos_protocol::decidearg &a) { - return u >> a.instance >> a.v; -} +MARSHALLABLE_STRUCT(prop_t) + +namespace paxos_protocol { + enum status : rpc_protocol::status { OK, ERR }; + struct prepareres { + bool oldinstance; + bool accept; + prop_t n_a; + string v_a; + + MEMBERS(oldinstance, accept, n_a, v_a) + }; + using node_t = string; + using nodes_t = vector; + using value_t = string; + + REMOTE_PROCEDURE_BASE(0x11000); + REMOTE_PROCEDURE(1, preparereq, (prepareres &, node_t, unsigned, prop_t)); + REMOTE_PROCEDURE(2, acceptreq, (bool &, node_t, unsigned, prop_t, value_t)); + REMOTE_PROCEDURE(3, decidereq, (int &, node_t, unsigned, value_t)); + REMOTE_PROCEDURE(4, heartbeat, (int &, string, unsigned)); +}; -inline marshall & operator<<(marshall &m, paxos_protocol::decidearg a) { - return m << a.instance << a.v; -} +MARSHALLABLE_STRUCT(paxos_protocol::prepareres) #endif