5 #include "rsm_protocol.h"
11 // rsm client interface.
13 // The client stubs package up an rpc, and then call the invoke procedure
14 // on the replicated state machine passing the RPC as an argument. This way
15 // the replicated state machine isn't service specific; any server can use it.
21 std::vector<std::string> known_mems;
22 std::mutex rsm_client_mutex;
23 void primary_failure();
26 rsm_client(std::string dst);
27 rsm_protocol::status invoke(int proc, std::string &rep, const std::string &req);
29 template<class R, class ...Args>
30 int call(unsigned int proc, R & r, const Args & ...a1);
32 template<class R> int call_m(unsigned int proc, R & r, const marshall & req);
36 int rsm_client::call_m(unsigned int proc, R & r, const marshall & req) {
39 int intret = invoke(proc, rep, req.cstr());
40 VERIFY( intret == rsm_client_protocol::OK );
43 if (intret < 0) return intret;
46 fprintf(stderr, "rsm_client::call_m: failed to unmarshall the reply.\n"
47 "You probably forgot to set the reply string in "
48 "rsm::client_invoke, or you may call RPC 0x%x with wrong return "
51 return rpc_const::unmarshal_reply_failure;
56 fprintf(stderr, "rsm_client::call_m: failed to unmarshall the reply.\n"
57 "You are probably calling RPC 0x%x with wrong return "
60 return rpc_const::unmarshal_reply_failure;
65 template<class R, class ...Args>
66 int rsm_client::call(unsigned int proc, R & r, const Args & ...a1) {
67 return call_m(proc, r, marshall{a1...});