| 133 | |
| 134 | template <class Request, class Response, class Callback> |
| 135 | bool SendMessageWithRetry(void (ServerType::*func)(google::protobuf::RpcController*, |
| 136 | const Request*, Response*, |
| 137 | google::protobuf::Closure*), |
| 138 | const Request* request, Response* response, Callback closure, |
| 139 | const std::string& tips, int32_t rpc_timeout, |
| 140 | ThreadPool* thread_pool = 0) { |
| 141 | if (NULL == server_client_.get()) { |
| 142 | // sync call |
| 143 | if (!closure) { |
| 144 | return false; |
| 145 | } |
| 146 | |
| 147 | // async call |
| 148 | ThreadPool::Task callback = |
| 149 | std::bind(&RpcClient::template UserCallback<Request, Response, Callback>, request, |
| 150 | response, closure, true, (int)sofa::pbrpc::RPC_ERROR_RESOLVE_ADDRESS); |
| 151 | thread_pool->AddTask(callback); |
| 152 | return true; |
| 153 | } |
| 154 | sofa::pbrpc::RpcController* rpc_controller = new sofa::pbrpc::RpcController; |
| 155 | rpc_controller->SetTimeout(rpc_timeout); |
| 156 | RpcCallbackParam<Request, Response, Callback>* param = |
| 157 | new RpcCallbackParam<Request, Response, Callback>(rpc_controller, request, response, |
| 158 | closure, tips, thread_pool); |
| 159 | google::protobuf::Closure* done = google::protobuf::NewCallback( |
| 160 | &RpcClient::template RpcCallback<Request, Response, Callback>, this, param); |
| 161 | (server_client_.get()->*func)(rpc_controller, request, response, done); |
| 162 | |
| 163 | // sync call |
| 164 | if (!closure) { |
| 165 | sync_call_event.Wait(); |
| 166 | return (!sync_call_failed); |
| 167 | } |
| 168 | |
| 169 | // async call |
| 170 | return true; |
| 171 | } |
| 172 | |
| 173 | template <class Request, class Response, class Callback> |
| 174 | static void RpcCallback(RpcClient<ServerType>* client, |
nothing calls this directly
no test coverage detected