summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-03-29 07:52:41 +0000
committerGeir Storli <geirst@verizonmedia.com>2019-03-29 07:52:41 +0000
commitd0dd5320ca4d41847b5b789d2a8c6f7c21061b5b (patch)
tree4a62641819ec793a9e4abbe07ce19811e6fef868 /logd
parentdb3105324e0d894ed3bed69ac32ec571fb5bc745 (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.cpp26
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();
}