in cpp-channel/cpp/HsChannel.h [96:141]
void onResponse(
apache::thrift::ClientReceiveState&& state) noexcept override {
SCOPE_EXIT {
delete this;
};
requestSentHelper();
if (!recv_result_) {
return;
}
if (state.isException()) {
auto ex = state.exception().what();
size_t len = ex.length();
auto buf = std::unique_ptr<uint8_t, decltype(free)*>{
reinterpret_cast<uint8_t*>(malloc(len * sizeof(uint8_t))), free};
// If you get a memory leak here, see Note [onResponse leak].
std::memcpy(buf.get(), ex.data(), len);
recv_result_->status = RECV_ERROR;
recv_result_->buffer = buf.release();
recv_result_->len = len;
hs_try_putmvar(cap_, recv_mvar_);
} else {
auto ioBuf = apache::thrift::LegacySerializedResponse(
state.protocolId(),
0,
state.messageType(),
methodName_,
state.extractSerializedResponse())
.buffer;
size_t len = ioBuf->computeChainDataLength();
auto msg = std::unique_ptr<uint8_t, decltype(free)*>{
reinterpret_cast<uint8_t*>(malloc(len * sizeof(uint8_t))), free};
auto pos = msg.get();
for (auto r : *ioBuf) {
std::memcpy(pos, r.data(), r.size());
pos += r.size();
}
recv_result_->status = RECV_SUCCESS;
recv_result_->buffer = msg.release();
recv_result_->len = len;
hs_try_putmvar(cap_, recv_mvar_);
}
}