Remove unnecessary TLV struct

Drive-by: Zero-copy RecvString
PiperOrigin-RevId: 332412385
Change-Id: I169ffa78f016ec2d55c1a3677ea97beed095123c
This commit is contained in:
Wiktor Garbacz 2020-09-18 02:22:54 -07:00 committed by Copybara-Service
parent 45c208b19a
commit 9ffa5afba6
2 changed files with 30 additions and 34 deletions

View File

@ -265,17 +265,16 @@ bool Comms::SendTLV(uint32_t tag, uint64_t length, const uint8_t* bytes) {
} }
bool Comms::RecvString(std::string* v) { bool Comms::RecvString(std::string* v) {
TLV tlv; uint32_t tag;
if (!RecvTLV(&tlv)) { if (!RecvTLV(&tag, v)) {
return false; return false;
} }
if (tlv.tag != kTagString) { if (tag != kTagString) {
SAPI_RAW_LOG(ERROR, "Expected (kTagString == 0x%x), got: 0x%x", kTagString, SAPI_RAW_LOG(ERROR, "Expected (kTagString == 0x%x), got: 0x%x", kTagString,
tlv.tag); tag);
return false; return false;
} }
v->assign(reinterpret_cast<const char*>(tlv.value.data()), tlv.value.size());
return true; return true;
} }
@ -285,16 +284,16 @@ bool Comms::SendString(const std::string& v) {
} }
bool Comms::RecvBytes(std::vector<uint8_t>* buffer) { bool Comms::RecvBytes(std::vector<uint8_t>* buffer) {
TLV tlv; uint32_t tag;
if (!RecvTLV(&tlv)) { if (!RecvTLV(&tag, buffer)) {
return false; return false;
} }
if (tlv.tag != kTagBytes) { if (tag != kTagBytes) {
buffer->clear();
SAPI_RAW_LOG(ERROR, "Expected (kTagBytes == 0x%x), got: 0x%u", kTagBytes, SAPI_RAW_LOG(ERROR, "Expected (kTagBytes == 0x%x), got: 0x%u", kTagBytes,
tlv.tag); tag);
return false; return false;
} }
buffer->swap(tlv.value);
return true; return true;
} }
@ -462,8 +461,9 @@ bool Comms::SendFD(int fd) {
} }
bool Comms::RecvProtoBuf(google::protobuf::Message* message) { bool Comms::RecvProtoBuf(google::protobuf::Message* message) {
TLV tlv; uint32_t tag;
if (!RecvTLV(&tlv)) { std::vector<uint8_t> bytes;
if (!RecvTLV(&tag, &bytes)) {
if (IsConnected()) { if (IsConnected()) {
SAPI_RAW_PLOG(ERROR, "RecvProtoBuf failed for (%s)", socket_name_); SAPI_RAW_PLOG(ERROR, "RecvProtoBuf failed for (%s)", socket_name_);
} else { } else {
@ -473,11 +473,11 @@ bool Comms::RecvProtoBuf(google::protobuf::Message* message) {
return false; return false;
} }
if (tlv.tag != kTagProto2) { if (tag != kTagProto2) {
SAPI_RAW_LOG(ERROR, "Expected tag: 0x%x, got: 0x%u", kTagProto2, tlv.tag); SAPI_RAW_LOG(ERROR, "Expected tag: 0x%x, got: 0x%u", kTagProto2, tag);
return false; return false;
} }
return message->ParseFromArray(tlv.value.data(), tlv.value.size()); return message->ParseFromArray(bytes.data(), bytes.size());
} }
bool Comms::SendProtoBuf(const google::protobuf::Message& message) { bool Comms::SendProtoBuf(const google::protobuf::Message& message) {
@ -599,18 +599,16 @@ bool Comms::RecvTL(uint32_t* tag, uint64_t* length) {
return true; return true;
} }
bool Comms::RecvTLV(TLV* tlv) { bool Comms::RecvTLV(uint32_t* tag, std::vector<uint8_t>* value) {
absl::MutexLock lock(&tlv_recv_transmission_mutex_); return RecvTLVGeneric(tag, value);
uint64_t length;
if (!RecvTL(&tlv->tag, &length)) {
return false;
}
tlv->value.resize(length);
return length == 0 || Recv(tlv->value.data(), length);
} }
bool Comms::RecvTLV(uint32_t* tag, std::vector<uint8_t>* value) { bool Comms::RecvTLV(uint32_t* tag, std::string* value) {
return RecvTLVGeneric(tag, value);
}
template <typename T>
bool Comms::RecvTLVGeneric(uint32_t* tag, T* value) {
absl::MutexLock lock(&tlv_recv_transmission_mutex_); absl::MutexLock lock(&tlv_recv_transmission_mutex_);
uint64_t length; uint64_t length;
if (!RecvTL(tag, &length)) { if (!RecvTL(tag, &length)) {
@ -618,7 +616,7 @@ bool Comms::RecvTLV(uint32_t* tag, std::vector<uint8_t>* value) {
} }
value->resize(length); value->resize(length);
return length == 0 || Recv(value->data(), length); return length == 0 || Recv(reinterpret_cast<uint8_t*>(value->data()), length);
} }
bool Comms::RecvTLV(uint32_t* tag, uint64_t* length, void* buffer, bool Comms::RecvTLV(uint32_t* tag, uint64_t* length, void* buffer,

View File

@ -109,6 +109,9 @@ class Comms {
// Receive a TLV structure, the memory for the value will be allocated // Receive a TLV structure, the memory for the value will be allocated
// by std::vector. // by std::vector.
bool RecvTLV(uint32_t* tag, std::vector<uint8_t>* value); bool RecvTLV(uint32_t* tag, std::vector<uint8_t>* value);
// Receive a TLV structure, the memory for the value will be allocated
// by std::string.
bool RecvTLV(uint32_t* tag, std::string* value);
// Receives a TLV value into a specified buffer without allocating memory. // Receives a TLV value into a specified buffer without allocating memory.
bool RecvTLV(uint32_t* tag, uint64_t* length, void* buffer, uint64_t buffer_size); bool RecvTLV(uint32_t* tag, uint64_t* length, void* buffer, uint64_t buffer_size);
@ -174,12 +177,6 @@ class Comms {
// State of the channel (enum), socket will have to be connected later on. // State of the channel (enum), socket will have to be connected later on.
State state_ = State::kUnconnected; State state_ = State::kUnconnected;
// TLV structure used to pass messages around.
struct TLV {
uint32_t tag;
std::vector<uint8_t> value;
};
// Special struct for passing credentials or FDs. Different from the one above // Special struct for passing credentials or FDs. Different from the one above
// as it inlines the value. This is important as the data is transmitted using // as it inlines the value. This is important as the data is transmitted using
// sendmsg/recvmsg instead of send/recv. // sendmsg/recvmsg instead of send/recv.
@ -201,8 +198,9 @@ class Comms {
bool RecvTL(uint32_t* tag, uint64_t* length) bool RecvTL(uint32_t* tag, uint64_t* length)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(tlv_recv_transmission_mutex_); ABSL_EXCLUSIVE_LOCKS_REQUIRED(tlv_recv_transmission_mutex_);
// Receives whole TLV structure, allocates memory for the data. // T has to be a ContiguousContainer
bool RecvTLV(TLV* tlv); template <typename T>
bool RecvTLVGeneric(uint32_t* tag, T* value);
// Receives arbitrary integers. // Receives arbitrary integers.
bool RecvInt(void* buffer, uint64_t len, uint32_t tag); bool RecvInt(void* buffer, uint64_t len, uint32_t tag);