Skip to content

Commit 545797b

Browse files
committed
http2: use static allocated arrays
PR-URL: nodejs#14239 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent c1d81a7 commit 545797b

3 files changed

Lines changed: 30 additions & 127 deletions

File tree

src/env-inl.h

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,6 @@ inline Environment::~Environment() {
330330
delete[] heap_space_statistics_buffer_;
331331
delete[] http_parser_buffer_;
332332
delete[] http2_socket_buffer_;
333-
delete[] http2_settings_buffer_;
334-
delete[] http2_options_buffer_;
335-
delete[] http2_session_state_buffer_;
336-
delete[] http2_stream_state_buffer_;
337-
delete[] http2_padding_buffer_;
338333
}
339334

340335
inline v8::Isolate* Environment::isolate() const {
@@ -475,56 +470,6 @@ inline void Environment::set_heap_space_statistics_buffer(double* pointer) {
475470
heap_space_statistics_buffer_ = pointer;
476471
}
477472

478-
inline uint32_t* Environment::http2_settings_buffer() const {
479-
CHECK_NE(http2_settings_buffer_, nullptr);
480-
return http2_settings_buffer_;
481-
}
482-
483-
inline void Environment::set_http2_settings_buffer(uint32_t* pointer) {
484-
CHECK_EQ(http2_settings_buffer_, nullptr); // Should be set only once
485-
http2_settings_buffer_ = pointer;
486-
}
487-
488-
inline uint32_t* Environment::http2_options_buffer() const {
489-
CHECK_NE(http2_options_buffer_, nullptr);
490-
return http2_options_buffer_;
491-
}
492-
493-
inline void Environment::set_http2_options_buffer(uint32_t* pointer) {
494-
CHECK_EQ(http2_options_buffer_, nullptr); // Should be set only once
495-
http2_options_buffer_ = pointer;
496-
}
497-
498-
inline double* Environment::http2_session_state_buffer() const {
499-
CHECK_NE(http2_session_state_buffer_, nullptr);
500-
return http2_session_state_buffer_;
501-
}
502-
503-
inline void Environment::set_http2_session_state_buffer(double* pointer) {
504-
CHECK_EQ(http2_session_state_buffer_, nullptr);
505-
http2_session_state_buffer_ = pointer;
506-
}
507-
508-
inline double* Environment::http2_stream_state_buffer() const {
509-
CHECK_NE(http2_stream_state_buffer_, nullptr);
510-
return http2_stream_state_buffer_;
511-
}
512-
513-
inline void Environment::set_http2_stream_state_buffer(double* pointer) {
514-
CHECK_EQ(http2_stream_state_buffer_, nullptr);
515-
http2_stream_state_buffer_ = pointer;
516-
}
517-
518-
inline uint32_t* Environment::http2_padding_buffer() const {
519-
CHECK_NE(http2_padding_buffer_, nullptr);
520-
return http2_padding_buffer_;
521-
}
522-
523-
inline void Environment::set_http2_padding_buffer(uint32_t* pointer) {
524-
CHECK_EQ(http2_padding_buffer_, nullptr);
525-
http2_padding_buffer_ = pointer;
526-
}
527-
528473
inline char* Environment::http_parser_buffer() const {
529474
return http_parser_buffer_;
530475
}

src/env.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -595,21 +595,6 @@ class Environment {
595595
inline double* heap_space_statistics_buffer() const;
596596
inline void set_heap_space_statistics_buffer(double* pointer);
597597

598-
inline uint32_t* http2_settings_buffer() const;
599-
inline void set_http2_settings_buffer(uint32_t* pointer);
600-
601-
inline uint32_t* http2_options_buffer() const;
602-
inline void set_http2_options_buffer(uint32_t* pointer);
603-
604-
inline double* http2_session_state_buffer() const;
605-
inline void set_http2_session_state_buffer(double* pointer);
606-
607-
inline double* http2_stream_state_buffer() const;
608-
inline void set_http2_stream_state_buffer(double* pointer);
609-
610-
inline uint32_t* http2_padding_buffer() const;
611-
inline void set_http2_padding_buffer(uint32_t* pointer);
612-
613598
inline char* http_parser_buffer() const;
614599
inline void set_http_parser_buffer(char* buffer);
615600
inline char* http2_socket_buffer() const;
@@ -719,11 +704,6 @@ class Environment {
719704

720705
double* heap_statistics_buffer_ = nullptr;
721706
double* heap_space_statistics_buffer_ = nullptr;
722-
uint32_t* http2_settings_buffer_ = nullptr;
723-
uint32_t* http2_options_buffer_ = nullptr;
724-
double* http2_session_state_buffer_ = nullptr;
725-
double* http2_stream_state_buffer_ = nullptr;
726-
uint32_t* http2_padding_buffer_ = nullptr;
727707

728708
char* http_parser_buffer_;
729709
char* http2_socket_buffer_;

src/node_http2.cc

Lines changed: 30 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,27 @@ enum Http2OptionsIndex {
5555
IDX_OPTIONS_FLAGS
5656
};
5757

58+
static uint32_t http2_padding_buffer[3];
59+
static uint32_t http2_options_buffer[IDX_OPTIONS_FLAGS + 1];
60+
static uint32_t http2_settings_buffer[IDX_SETTINGS_COUNT + 1];
61+
static double http2_session_state_buffer[IDX_SESSION_STATE_COUNT];
62+
static double http2_stream_state_buffer[IDX_STREAM_STATE_COUNT];
63+
64+
static const size_t http2_options_buffer_byte_length =
65+
sizeof(http2_options_buffer) * (IDX_OPTIONS_FLAGS + 1);
66+
static const size_t http2_settings_buffer_byte_length =
67+
sizeof(http2_settings_buffer) * (IDX_SETTINGS_COUNT + 1);
68+
static const size_t http2_padding_buffer_byte_length =
69+
sizeof(http2_padding_buffer) * 3;
70+
static const size_t http2_stream_state_buffer_byte_length =
71+
sizeof(http2_stream_state_buffer) * IDX_STREAM_STATE_COUNT;
72+
static const size_t http2_session_state_buffer_byte_length =
73+
sizeof(http2_session_state_buffer) * IDX_SESSION_STATE_COUNT;
74+
5875
Http2Options::Http2Options(Environment* env) {
5976
nghttp2_option_new(&options_);
6077

61-
uint32_t* buffer = env->http2_options_buffer();
78+
uint32_t* buffer = http2_options_buffer;
6279
uint32_t flags = buffer[IDX_OPTIONS_FLAGS];
6380

6481
if (flags & (1 << IDX_OPTIONS_MAX_DEFLATE_DYNAMIC_TABLE_SIZE)) {
@@ -148,7 +165,7 @@ ssize_t Http2Session::OnCallbackPadding(size_t frameLen,
148165
Context::Scope context_scope(context);
149166

150167
if (object()->Has(context, env()->ongetpadding_string()).FromJust()) {
151-
uint32_t* buffer = env()->http2_padding_buffer();
168+
uint32_t* buffer = http2_padding_buffer;
152169
buffer[0] = frameLen;
153170
buffer[1] = maxPayloadLen;
154171
MakeCallback(env()->ongetpadding_string(), 0, nullptr);
@@ -189,7 +206,7 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
189206
std::vector<nghttp2_settings_entry> entries;
190207
entries.reserve(6);
191208

192-
uint32_t* const buffer = env->http2_settings_buffer();
209+
uint32_t* buffer = http2_settings_buffer;
193210
uint32_t flags = buffer[IDX_SETTINGS_COUNT];
194211

195212
if (flags & (1 << IDX_SETTINGS_HEADER_TABLE_SIZE)) {
@@ -248,8 +265,7 @@ void PackSettings(const FunctionCallbackInfo<Value>& args) {
248265
// Used to fill in the spec defined initial values for each setting.
249266
void RefreshDefaultSettings(const FunctionCallbackInfo<Value>& args) {
250267
DEBUG_HTTP2("Http2Session: refreshing default settings\n");
251-
Environment* env = Environment::GetCurrent(args);
252-
uint32_t* const buffer = env->http2_settings_buffer();
268+
uint32_t* buffer = http2_settings_buffer;
253269
buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
254270
DEFAULT_SETTINGS_HEADER_TABLE_SIZE;
255271
buffer[IDX_SETTINGS_ENABLE_PUSH] =
@@ -272,10 +288,9 @@ void RefreshSettings(const FunctionCallbackInfo<Value>& args) {
272288
CHECK(args[0]->IsObject());
273289
Http2Session* session;
274290
ASSIGN_OR_RETURN_UNWRAP(&session, args[0].As<Object>());
275-
Environment* env = session->env();
276291
nghttp2_session* s = session->session();
277292

278-
uint32_t* const buffer = env->http2_settings_buffer();
293+
uint32_t* buffer = http2_settings_buffer;
279294
buffer[IDX_SETTINGS_HEADER_TABLE_SIZE] =
280295
fn(s, NGHTTP2_SETTINGS_HEADER_TABLE_SIZE);
281296
buffer[IDX_SETTINGS_MAX_CONCURRENT_STREAMS] =
@@ -295,8 +310,7 @@ void RefreshSessionState(const FunctionCallbackInfo<Value>& args) {
295310
DEBUG_HTTP2("Http2Session: refreshing session state\n");
296311
CHECK_EQ(args.Length(), 1);
297312
CHECK(args[0]->IsObject());
298-
Environment* env = Environment::GetCurrent(args);
299-
double* const buffer = env->http2_session_state_buffer();
313+
double* buffer = http2_session_state_buffer;
300314
Http2Session* session;
301315
ASSIGN_OR_RETURN_UNWRAP(&session, args[0].As<Object>());
302316
nghttp2_session* s = session->session();
@@ -333,7 +347,7 @@ void RefreshStreamState(const FunctionCallbackInfo<Value>& args) {
333347
nghttp2_session* s = session->session();
334348
Nghttp2Stream* stream;
335349

336-
double* const buffer = env->http2_stream_state_buffer();
350+
double* buffer = http2_stream_state_buffer;
337351

338352
if ((stream = session->FindStream(id)) == nullptr) {
339353
buffer[IDX_STREAM_STATE] = NGHTTP2_STREAM_STATE_IDLE;
@@ -438,9 +452,7 @@ void Http2Session::SubmitSettings(const FunctionCallbackInfo<Value>& args) {
438452
Http2Session* session;
439453
ASSIGN_OR_RETURN_UNWRAP(&session, args.Holder());
440454

441-
Environment* env = session->env();
442-
443-
uint32_t* const buffer = env->http2_settings_buffer();
455+
uint32_t* buffer = http2_settings_buffer;
444456
uint32_t flags = buffer[IDX_SETTINGS_COUNT];
445457

446458
std::vector<nghttp2_settings_entry> entries;
@@ -1107,74 +1119,40 @@ void Initialize(Local<Object> target,
11071119
HandleScope scope(isolate);
11081120

11091121
// Initialize the buffer used for padding callbacks
1110-
env->set_http2_padding_buffer(new uint32_t[3]);
1111-
const size_t http2_padding_buffer_byte_length =
1112-
sizeof(*env->http2_padding_buffer()) * 3;
1113-
11141122
target->Set(context,
11151123
FIXED_ONE_BYTE_STRING(env->isolate(), "paddingArrayBuffer"),
11161124
ArrayBuffer::New(env->isolate(),
1117-
env->http2_padding_buffer(),
1125+
&http2_padding_buffer,
11181126
http2_padding_buffer_byte_length))
11191127
.FromJust();
11201128

11211129
// Initialize the buffer used to store the session state
1122-
env->set_http2_session_state_buffer(
1123-
new double[IDX_SESSION_STATE_COUNT]);
1124-
1125-
const size_t http2_session_state_buffer_byte_length =
1126-
sizeof(*env->http2_session_state_buffer()) *
1127-
IDX_SESSION_STATE_COUNT;
1128-
11291130
target->Set(context,
11301131
FIXED_ONE_BYTE_STRING(env->isolate(), "sessionStateArrayBuffer"),
11311132
ArrayBuffer::New(env->isolate(),
1132-
env->http2_session_state_buffer(),
1133+
&http2_session_state_buffer,
11331134
http2_session_state_buffer_byte_length))
11341135
.FromJust();
11351136

11361137
// Initialize the buffer used to store the stream state
1137-
env->set_http2_stream_state_buffer(
1138-
new double[IDX_STREAM_STATE_COUNT]);
1139-
1140-
const size_t http2_stream_state_buffer_byte_length =
1141-
sizeof(*env->http2_stream_state_buffer()) *
1142-
IDX_STREAM_STATE_COUNT;
1143-
11441138
target->Set(context,
11451139
FIXED_ONE_BYTE_STRING(env->isolate(), "streamStateArrayBuffer"),
11461140
ArrayBuffer::New(env->isolate(),
1147-
env->http2_stream_state_buffer(),
1141+
&http2_stream_state_buffer,
11481142
http2_stream_state_buffer_byte_length))
11491143
.FromJust();
11501144

1151-
// Initialize the buffer used to store the current settings
1152-
env->set_http2_settings_buffer(
1153-
new uint32_t[IDX_SETTINGS_COUNT + 1]);
1154-
1155-
const size_t http2_settings_buffer_byte_length =
1156-
sizeof(*env->http2_settings_buffer()) *
1157-
(IDX_SETTINGS_COUNT + 1);
1158-
11591145
target->Set(context,
11601146
FIXED_ONE_BYTE_STRING(env->isolate(), "settingsArrayBuffer"),
11611147
ArrayBuffer::New(env->isolate(),
1162-
env->http2_settings_buffer(),
1148+
&http2_settings_buffer,
11631149
http2_settings_buffer_byte_length))
11641150
.FromJust();
11651151

1166-
// Initialize the buffer used to store the options
1167-
env->set_http2_options_buffer(
1168-
new uint32_t[IDX_OPTIONS_FLAGS + 1]);
1169-
1170-
const size_t http2_options_buffer_byte_length =
1171-
sizeof(*env->http2_options_buffer()) *
1172-
(IDX_OPTIONS_FLAGS + 1);
1173-
11741152
target->Set(context,
11751153
FIXED_ONE_BYTE_STRING(env->isolate(), "optionsArrayBuffer"),
11761154
ArrayBuffer::New(env->isolate(),
1177-
env->http2_options_buffer(),
1155+
&http2_options_buffer,
11781156
http2_options_buffer_byte_length))
11791157
.FromJust();
11801158

0 commit comments

Comments
 (0)