X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/f2170465073de34adf89161d4287182b518352c4..2546a41ad36fdc9ef6471cb35a1d56930ae1b527:/config.h?ds=sidebyside diff --git a/config.h b/config.h index fcf1566..074cbe9 100644 --- a/config.h +++ b/config.h @@ -6,6 +6,19 @@ #include "paxos.h" #include "lock.h" +using std::chrono::steady_clock; +using std::chrono::seconds; +using std::string; +using std::vector; +using std::thread; +using std::ostringstream; +using std::istringstream; +using std::ostream_iterator; +using std::istream_iterator; +using std::copy; +using std::min; +using std::min_element; + class config_view_change { public: virtual void commit_change(unsigned view_id) = 0; @@ -14,42 +27,41 @@ class config_view_change { class config : public paxos_change { private: - acceptor *paxos_acceptor; - proposer *paxos_proposer; unsigned my_view_id; - std::string first; - std::string me; + string first; + string me; config_view_change *vc; - std::vector mems; + acceptor paxos_acceptor; + proposer paxos_proposer; + vector mems; mutex cfg_mutex; - std::condition_variable config_cond; - paxos_protocol::status heartbeat(int &r, std::string m, unsigned instance); - std::string value(const std::vector &mems) const; - void members(const std::string &v, std::vector &m) const; - void get_view(unsigned instance, std::vector &m, lock &cfg_mutex_lock); - bool remove(const std::string &); + cond config_cond; + paxos_protocol::status heartbeat(int &r, string m, unsigned instance); + string value(const vector &mems) const; + vector members(const string &v) const; + void get_view(unsigned instance, vector &m, lock &cfg_mutex_lock); + bool remove(const string &, lock &cfg_mutex_lock); void reconstruct(lock &cfg_mutex_lock); typedef enum { OK, // response and same view # VIEWERR, // response but different view # FAILURE, // no response } heartbeat_t; - heartbeat_t doheartbeat(const std::string &m); + heartbeat_t doheartbeat(const string &m, lock &cfg_mutex_lock); public: - config(const std::string &_first, - const std::string &_me, - config_view_change *_vc); + config(const string &_first, const string &_me, config_view_change *_vc); unsigned view_id() { return my_view_id; } - const std::string &myaddr() const { return me; } - std::string dump() { return paxos_acceptor->dump(); } - void get_view(unsigned instance, std::vector &m); - void restore(const std::string &s); - bool add(const std::string &, unsigned view_id); - bool ismember(const std::string &m, unsigned view_id); + const string &myaddr() const { return me; } + string dump() { return paxos_acceptor.dump(); } + void get_view(unsigned instance, vector &m); + void restore(const string &s); + bool add(const string &, unsigned view_id); + bool ismember(const string &m, unsigned view_id); void heartbeater(void); - void paxos_commit(unsigned instance, const std::string &v); - rpcs *get_rpcs() { return paxos_acceptor->get_rpcs(); } - void breakpoint(int b) { paxos_proposer->breakpoint(b); } + void paxos_commit(unsigned instance, const string &v); + // XXX hack; maybe should have its own port number + rpcs *get_rpcs() { return paxos_acceptor.get_rpcs(); } + void breakpoint(int b) { paxos_proposer.breakpoint(b); } }; #endif