diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-03-29 07:52:41 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-03-29 07:52:41 +0000 |
commit | d0dd5320ca4d41847b5b789d2a8c6f7c21061b5b (patch) | |
tree | 4a62641819ec793a9e4abbe07ce19811e6fef868 /logd | |
parent | db3105324e0d894ed3bed69ac32ec571fb5bc745 (diff) |
Use a guarded request to avoid problems with forgetting to call SubRef().
Diffstat (limited to 'logd')
-rw-r--r-- | logd/src/logd/rpc_forwarder.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/logd/src/logd/rpc_forwarder.cpp b/logd/src/logd/rpc_forwarder.cpp index 54ddcbb7c81..4dbf9e768bc 100644 --- a/logd/src/logd/rpc_forwarder.cpp +++ b/logd/src/logd/rpc_forwarder.cpp @@ -95,6 +95,25 @@ RpcForwarder::forwardLine(std::string_view line) } } +namespace { + +class GuardedRequest { +private: + FRT_RPCRequest* _request; +public: + GuardedRequest() + : _request(new FRT_RPCRequest()) + {} + ~GuardedRequest() { + _request->SubRef(); + } + FRT_RPCRequest& operator*() const { return *_request; } + FRT_RPCRequest* get() const { return _request; } + FRT_RPCRequest* operator->() const { return get(); } +}; + +} + void RpcForwarder::flush() { @@ -103,22 +122,19 @@ RpcForwarder::flush() } ProtoConverter::ProtoLogRequest proto_request; ProtoConverter::log_messages_to_proto(_messages, proto_request); - auto request = new FRT_RPCRequest(); + GuardedRequest request; encode_log_request(proto_request, *request); - _target->InvokeSync(request, _rpc_timeout_secs); + _target->InvokeSync(request.get(), _rpc_timeout_secs); if (!request->CheckReturnTypes("bix")) { auto error_msg = make_string("Error in rpc reply from '%s': '%s'", _connection_spec.c_str(), request->GetErrorMessage()); - request->SubRef(); throw ConnectionException(error_msg); } ProtoConverter::ProtoLogResponse proto_response; if (!decode_log_response(*request, proto_response)) { auto error_msg = make_string("Error during decoding of protobuf response from '%s'", _connection_spec.c_str()); - request->SubRef(); throw DecodeException(error_msg); } - request->SubRef(); _messages.clear(); } |