1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-08 09:42:06 +03:00

elide malloc calls

Summary: - optimizing `setSupportedExtensionTransportParameters()` to elide invocations to malloc()

Reviewed By: mjoras

Differential Revision: D43844018

fbshipit-source-id: 38da5c62786f795a3a79e7592d06d4da1d7487ba
This commit is contained in:
Hani Damlaj
2023-03-15 15:58:02 -07:00
committed by Facebook GitHub Bot
parent 3452070d5c
commit 6cd4f47735
9 changed files with 94 additions and 115 deletions

View File

@@ -1745,11 +1745,11 @@ bool hasInitialOrHandshakeCiphers(QuicConnectionStateBase& conn) {
} }
bool setCustomTransportParameter( bool setCustomTransportParameter(
std::unique_ptr<CustomTransportParameter> customParam, const CustomTransportParameter& customParam,
std::vector<TransportParameter>& customTransportParameters) { std::vector<TransportParameter>& customTransportParameters) {
// Check that the parameter id is in the "private parameter" range, as // Check that the parameter id is in the "private parameter" range, as
// described by the spec. // described by the spec.
if (static_cast<uint16_t>(customParam->getParameterId()) < if (static_cast<uint16_t>(customParam.getParameterId()) <
kCustomTransportParameterThreshold) { kCustomTransportParameterThreshold) {
LOG(ERROR) << "invalid parameter id"; LOG(ERROR) << "invalid parameter id";
return false; return false;
@@ -1761,7 +1761,7 @@ bool setCustomTransportParameter(
customTransportParameters.begin(), customTransportParameters.begin(),
customTransportParameters.end(), customTransportParameters.end(),
[&customParam](const TransportParameter& param) { [&customParam](const TransportParameter& param) {
return param.parameter == customParam->getParameterId(); return param.parameter == customParam.getParameterId();
}); });
// if a match has been found, we return failure // if a match has been found, we return failure
@@ -1770,7 +1770,7 @@ bool setCustomTransportParameter(
return false; return false;
} }
customTransportParameters.push_back(customParam->encode()); customTransportParameters.push_back(customParam.encode());
return true; return true;
} }

View File

@@ -332,7 +332,7 @@ bool writeLoopTimeLimit(
* - checks that the param is not in the provided vector already * - checks that the param is not in the provided vector already
*/ */
bool setCustomTransportParameter( bool setCustomTransportParameter(
std::unique_ptr<CustomTransportParameter> customParam, const CustomTransportParameter& customParam,
std::vector<TransportParameter>& customTransportParameters); std::vector<TransportParameter>& customTransportParameters);
bool toWriteInitialAcks(const quic::QuicConnectionStateBase& conn); bool toWriteInitialAcks(const quic::QuicConnectionStateBase& conn);

View File

@@ -4535,28 +4535,26 @@ TEST_F(QuicTransportFunctionsTest, CustomTransportParamTest) {
// Add new param. // Add new param.
EXPECT_TRUE(setCustomTransportParameter( EXPECT_TRUE(setCustomTransportParameter(
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter(kCustomTransportParameterThreshold, 0),
kCustomTransportParameterThreshold, 0),
customTransportParameters)); customTransportParameters));
EXPECT_EQ(customTransportParameters.size(), 1); EXPECT_EQ(customTransportParameters.size(), 1);
// Existing param not added. // Existing param not added.
EXPECT_FALSE(setCustomTransportParameter( EXPECT_FALSE(setCustomTransportParameter(
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter(kCustomTransportParameterThreshold, 1),
kCustomTransportParameterThreshold, 1),
customTransportParameters)); customTransportParameters));
EXPECT_EQ(customTransportParameters.size(), 1); EXPECT_EQ(customTransportParameters.size(), 1);
// Bad param id is not added. // Bad param id is not added.
EXPECT_FALSE(setCustomTransportParameter( EXPECT_FALSE(setCustomTransportParameter(
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter(
kCustomTransportParameterThreshold - 1, 2), kCustomTransportParameterThreshold - 1, 2),
customTransportParameters)); customTransportParameters));
EXPECT_EQ(customTransportParameters.size(), 1); EXPECT_EQ(customTransportParameters.size(), 1);
// Another valid param added. // Another valid param added.
EXPECT_TRUE(setCustomTransportParameter( EXPECT_TRUE(setCustomTransportParameter(
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter(
kCustomTransportParameterThreshold + 1, 0), kCustomTransportParameterThreshold + 1, 0),
customTransportParameters)); customTransportParameters));
EXPECT_EQ(customTransportParameters.size(), 2); EXPECT_EQ(customTransportParameters.size(), 2);

View File

@@ -1655,54 +1655,48 @@ void QuicClientTransport::setSelfOwning() {
} }
void QuicClientTransport::setSupportedExtensionTransportParameters() { void QuicClientTransport::setSupportedExtensionTransportParameters() {
if (conn_->transportSettings.minAckDelay.hasValue()) { const auto& ts = conn_->transportSettings;
auto minAckDelayParam = std::make_unique<CustomIntegralTransportParameter>(
if (ts.minAckDelay.hasValue()) {
CustomIntegralTransportParameter minAckDelayParam(
static_cast<uint64_t>(TransportParameterId::min_ack_delay), static_cast<uint64_t>(TransportParameterId::min_ack_delay),
conn_->transportSettings.minAckDelay.value().count()); ts.minAckDelay.value().count());
customTransportParameters_.push_back(minAckDelayParam->encode()); customTransportParameters_.push_back(minAckDelayParam.encode());
}
if (conn_->transportSettings.datagramConfig.enabled) {
auto maxDatagramFrameSize =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::max_datagram_frame_size),
conn_->datagramState.maxReadFrameSize);
customTransportParameters_.push_back(maxDatagramFrameSize->encode());
} }
auto ackReceiveTimestampsEnabled = if (ts.datagramConfig.enabled) {
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter maxDatagramFrameSize(
static_cast<uint64_t>( static_cast<uint64_t>(TransportParameterId::max_datagram_frame_size),
TransportParameterId::ack_receive_timestamps_enabled), conn_->datagramState.maxReadFrameSize);
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer customTransportParameters_.push_back(maxDatagramFrameSize.encode());
.has_value()
? 1
: 0);
customTransportParameters_.push_back(ackReceiveTimestampsEnabled->encode());
if (conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.has_value()) {
auto maxReceiveTimestampsPerAck =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::max_receive_timestamps_per_ack),
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.value()
.max_receive_timestamps_per_ack);
customTransportParameters_.push_back(maxReceiveTimestampsPerAck->encode());
auto receiveTimestampsExponent =
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::receive_timestamps_exponent),
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.value()
.receive_timestamps_exponent);
customTransportParameters_.push_back(receiveTimestampsExponent->encode());
} }
if (conn_->transportSettings.advertisedKnobFrameSupport) { CustomIntegralTransportParameter ackReceiveTimestampsEnabled(
auto knobFrameSupport = std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(
TransportParameterId::ack_receive_timestamps_enabled),
ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value() ? 1 : 0);
customTransportParameters_.push_back(ackReceiveTimestampsEnabled.encode());
if (ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value()) {
CustomIntegralTransportParameter maxReceiveTimestampsPerAck(
static_cast<uint64_t>(
TransportParameterId::max_receive_timestamps_per_ack),
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
.max_receive_timestamps_per_ack);
customTransportParameters_.push_back(maxReceiveTimestampsPerAck.encode());
CustomIntegralTransportParameter receiveTimestampsExponent(
static_cast<uint64_t>(
TransportParameterId::receive_timestamps_exponent),
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
.receive_timestamps_exponent);
customTransportParameters_.push_back(receiveTimestampsExponent.encode());
}
if (ts.advertisedKnobFrameSupport) {
CustomIntegralTransportParameter knobFrameSupport(
static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1); static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1);
customTransportParameters_.push_back(knobFrameSupport->encode()); customTransportParameters_.push_back(knobFrameSupport.encode());
} }
} }
@@ -1810,13 +1804,12 @@ void QuicClientTransport::maybeEnableStreamGroups() {
return; return;
} }
auto streamGroupsEnabledParam = CustomIntegralTransportParameter streamGroupsEnabledParam(
std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled), conn_->transportSettings.advertisedMaxStreamGroups);
conn_->transportSettings.advertisedMaxStreamGroups);
if (!setCustomTransportParameter( if (!setCustomTransportParameter(
std::move(streamGroupsEnabledParam), customTransportParameters_)) { streamGroupsEnabledParam, customTransportParameters_)) {
LOG(ERROR) << "failed to set stream groups enabled transport parameter"; LOG(ERROR) << "failed to set stream groups enabled transport parameter";
} }
} }

View File

@@ -236,12 +236,11 @@ TEST_P(
std::vector<TransportParameter> transportParams; std::vector<TransportParameter> transportParams;
if (GetParam().peerMaxGroupsIn > 0) { if (GetParam().peerMaxGroupsIn > 0) {
auto streamGroupsEnabledParam = CustomIntegralTransportParameter streamGroupsEnabledParam(
std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled), GetParam().peerMaxGroupsIn);
GetParam().peerMaxGroupsIn); CHECK(
CHECK(setCustomTransportParameter( setCustomTransportParameter(streamGroupsEnabledParam, transportParams));
std::move(streamGroupsEnabledParam), transportParams));
} }
ServerTransportParameters serverTransportParams = { ServerTransportParameters serverTransportParams = {
std::move(transportParams)}; std::move(transportParams)};

View File

@@ -80,7 +80,7 @@ TransportParameter encodeIntegerParameter(
return {id, std::move(data)}; return {id, std::move(data)};
} }
TransportParameterId CustomTransportParameter::getParameterId() { TransportParameterId CustomTransportParameter::getParameterId() const {
return static_cast<TransportParameterId>(id_); return static_cast<TransportParameterId>(id_);
} }

View File

@@ -56,7 +56,7 @@ struct TransportParameter {
class CustomTransportParameter { class CustomTransportParameter {
public: public:
TransportParameterId getParameterId(); TransportParameterId getParameterId() const;
virtual TransportParameter encode() const = 0; virtual TransportParameter encode() const = 0;

View File

@@ -1562,60 +1562,50 @@ QuicServerConnectionState::createAndAddNewSelfConnId() {
std::vector<TransportParameter> setSupportedExtensionTransportParameters( std::vector<TransportParameter> setSupportedExtensionTransportParameters(
QuicServerConnectionState& conn) { QuicServerConnectionState& conn) {
std::vector<TransportParameter> customTransportParams; std::vector<TransportParameter> customTransportParams;
if (conn.transportSettings.datagramConfig.enabled) { const auto& ts = conn.transportSettings;
auto maxDatagramFrameSize = if (ts.datagramConfig.enabled) {
std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter maxDatagramFrameSize(
static_cast<uint64_t>( static_cast<uint64_t>(TransportParameterId::max_datagram_frame_size),
TransportParameterId::max_datagram_frame_size), conn.datagramState.maxReadFrameSize);
conn.datagramState.maxReadFrameSize);
customTransportParams.push_back(maxDatagramFrameSize->encode());
} }
if (conn.transportSettings.advertisedMaxStreamGroups > 0) { if (ts.advertisedMaxStreamGroups > 0) {
auto streamGroupsEnabledParam = CustomIntegralTransportParameter streamGroupsEnabledParam(
std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled), ts.advertisedMaxStreamGroups);
conn.transportSettings.advertisedMaxStreamGroups);
if (!setCustomTransportParameter( if (!setCustomTransportParameter(
std::move(streamGroupsEnabledParam), customTransportParams)) { streamGroupsEnabledParam, customTransportParams)) {
LOG(ERROR) << "failed to set stream groups enabled transport parameter"; LOG(ERROR) << "failed to set stream groups enabled transport parameter";
} }
} }
auto ackReceiveTimestampsEnabled = CustomIntegralTransportParameter ackReceiveTimestampsEnabled(
std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(
static_cast<uint64_t>( TransportParameterId::ack_receive_timestamps_enabled),
TransportParameterId::ack_receive_timestamps_enabled), ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value() ? 1 : 0);
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer customTransportParams.push_back(ackReceiveTimestampsEnabled.encode());
.has_value()
? 1 if (ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value()) {
: 0); CustomIntegralTransportParameter maxReceiveTimestampsPerAck(
customTransportParams.push_back(ackReceiveTimestampsEnabled->encode()); static_cast<uint64_t>(
if (conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer TransportParameterId::max_receive_timestamps_per_ack),
.has_value()) { ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
auto maxReceiveTimestampsPerAck = .max_receive_timestamps_per_ack);
std::make_unique<CustomIntegralTransportParameter>( customTransportParams.push_back(maxReceiveTimestampsPerAck.encode());
static_cast<uint64_t>(
TransportParameterId::max_receive_timestamps_per_ack), CustomIntegralTransportParameter receiveTimestampsExponent(
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer static_cast<uint64_t>(
.value() TransportParameterId::receive_timestamps_exponent),
.max_receive_timestamps_per_ack); ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
customTransportParams.push_back(maxReceiveTimestampsPerAck->encode()); .receive_timestamps_exponent);
auto receiveTimestampsExponent = customTransportParams.push_back(receiveTimestampsExponent.encode());
std::make_unique<CustomIntegralTransportParameter>(
static_cast<uint64_t>(
TransportParameterId::receive_timestamps_exponent),
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
.value()
.receive_timestamps_exponent);
customTransportParams.push_back(receiveTimestampsExponent->encode());
} }
if (conn.transportSettings.advertisedKnobFrameSupport) { if (ts.advertisedKnobFrameSupport) {
auto knobFrameSupport = std::make_unique<CustomIntegralTransportParameter>( CustomIntegralTransportParameter knobFrameSupport(
static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1); static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1);
customTransportParams.push_back(knobFrameSupport->encode()); customTransportParams.push_back(knobFrameSupport.encode());
} }
return customTransportParams; return customTransportParams;

View File

@@ -296,12 +296,11 @@ TEST_P(
std::vector<TransportParameter> transportParams; std::vector<TransportParameter> transportParams;
if (GetParam().peerMaxGroupsIn > 0) { if (GetParam().peerMaxGroupsIn > 0) {
auto streamGroupsEnabledParam = CustomIntegralTransportParameter streamGroupsEnabledParam(
std::make_unique<CustomIntegralTransportParameter>( static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled), GetParam().peerMaxGroupsIn);
GetParam().peerMaxGroupsIn); CHECK(
CHECK(setCustomTransportParameter( setCustomTransportParameter(streamGroupsEnabledParam, transportParams));
std::move(streamGroupsEnabledParam), transportParams));
} }
ClientTransportParameters clientTransportParams = { ClientTransportParameters clientTransportParams = {
std::move(transportParams)}; std::move(transportParams)};