Skip to content

Commit 26d1471

Browse files
committed
http: use symbol for FreeList's is_reused
This also at least keeps up the appearance of FreeList being a generic all purpose thing (right now it is only used for HTTP parsers but theoretically it could be used for any reusable resource). The previous name "needsAsyncReset" implied a tight coupling to to async resources, the new name "is_reused" is more generic.
1 parent d46dc79 commit 26d1471

9 files changed

Lines changed: 26 additions & 21 deletions

File tree

benchmark/misc/freelist.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const bench = common.createBenchmark(main, {
99
});
1010

1111
function main({ n }) {
12-
const FreeList = require('internal/freelist');
12+
const { FreeList } = require('internal/freelist');
1313
const poolSize = 1000;
1414
const list = new FreeList('test', poolSize, Object);
1515
var j;

lib/_http_client.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const {
5151
ERR_UNESCAPED_CHARACTERS
5252
} = require('internal/errors').codes;
5353
const { validateTimerDuration } = require('internal/timers');
54+
const is_reused_symbol = require('internal/freelist').symbols.is_reused_symbol;
5455

5556
const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/;
5657

@@ -635,10 +636,10 @@ function tickOnSocket(req, socket) {
635636
var parser = parsers.alloc();
636637
req.socket = socket;
637638
req.connection = socket;
638-
if (destroyHooksExist() && parser.needsAsyncReset && parser.getAsyncId()) {
639+
if (destroyHooksExist() && parser[is_reused_symbol] && parser.getAsyncId()) {
639640
emitDestroy(parser.getAsyncId());
640641
}
641-
parser.reinitialize(HTTPParser.RESPONSE, parser.needsAsyncReset);
642+
parser.reinitialize(HTTPParser.RESPONSE, parser[is_reused_symbol]);
642643
parser.socket = socket;
643644
parser.outgoing = req;
644645
req.parser = parser;

lib/_http_common.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
const { methods, HTTPParser } = internalBinding('http_parser');
2525

26-
const FreeList = require('internal/freelist');
26+
const { FreeList } = require('internal/freelist');
2727
const { ondrain } = require('internal/http');
2828
const incoming = require('_http_incoming');
2929
const {

lib/_http_server.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const {
4444
emitDestroy,
4545
getOrSetAsyncId
4646
} = require('internal/async_hooks');
47+
const is_reused_symbol = require('internal/freelist').symbols.is_reused_symbol;
4748
const { IncomingMessage } = require('_http_incoming');
4849
const {
4950
ERR_HTTP_HEADERS_SENT,
@@ -340,10 +341,10 @@ function connectionListenerInternal(server, socket) {
340341
socket.on('timeout', socketOnTimeout);
341342

342343
var parser = parsers.alloc();
343-
if (destroyHooksExist() && parser.needsAsyncReset && parser.getAsyncId()) {
344+
if (destroyHooksExist() && parser[is_reused_symbol] && parser.getAsyncId()) {
344345
emitDestroy(parser.getAsyncId());
345346
}
346-
parser.reinitialize(HTTPParser.REQUEST, parser.needsAsyncReset);
347+
parser.reinitialize(HTTPParser.REQUEST, parser[is_reused_symbol]);
347348
parser.socket = socket;
348349
socket.parser = parser;
349350

lib/internal/freelist.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict';
22

3+
const is_reused_symbol = Symbol('isReused');
4+
35
class FreeList {
46
constructor(name, max, ctor) {
57
this.name = name;
@@ -10,8 +12,8 @@ class FreeList {
1012

1113
alloc() {
1214
return this.list.length ?
13-
needsToCallAsyncReset(this.list.pop()) :
14-
mustNotCallAsyncReset(this.ctor.apply(this, arguments));
15+
setIsReused(this.list.pop(), true) :
16+
setIsReused(this.ctor.apply(this, arguments), false);
1517
}
1618

1719
free(obj) {
@@ -23,14 +25,14 @@ class FreeList {
2325
}
2426
}
2527

26-
function needsToCallAsyncReset(item) {
27-
item.needsAsyncReset = true;
28+
function setIsReused(item, reused) {
29+
item[is_reused_symbol] = reused;
2830
return item;
2931
}
3032

31-
function mustNotCallAsyncReset(item) {
32-
item.needsAsyncReset = false;
33-
return item;
34-
}
35-
36-
module.exports = FreeList;
33+
module.exports = {
34+
FreeList,
35+
symbols: {
36+
is_reused_symbol
37+
}
38+
};

src/node_http_parser.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ class Parser : public AsyncWrap, public StreamListener {
466466

467467
CHECK(args[0]->IsInt32());
468468
CHECK(args[1]->IsBoolean());
469-
bool needsAsyncReset = args[1]->IsTrue();
469+
bool isReused = args[1]->IsTrue();
470470
http_parser_type type =
471471
static_cast<http_parser_type>(args[0].As<Int32>()->Value());
472472

@@ -478,7 +478,7 @@ class Parser : public AsyncWrap, public StreamListener {
478478
// This parser has either just been created or it is being reused.
479479
// We must only call AsyncReset for the latter case, because AsyncReset has
480480
// already been called via the constructor for the former case.
481-
if (needsAsyncReset) {
481+
if (isReused) {
482482
parser->AsyncReset();
483483
}
484484
parser->Init(type);

test/parallel/test-freelist.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
require('../common');
66
const assert = require('assert');
7-
const FreeList = require('internal/freelist');
7+
const { FreeList } = require('internal/freelist');
88

99
assert.strictEqual(typeof FreeList, 'function');
1010

test/parallel/test-internal-modules-expose.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ const config = process.binding('config');
77

88
console.log(config, process.argv);
99

10-
assert.strictEqual(typeof require('internal/freelist'), 'function');
10+
assert.strictEqual(typeof require('internal/freelist').FreeList, 'function');
1111
assert.strictEqual(config.exposeInternals, true);

test/sequential/test-http-regr-gh-2928.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const common = require('../common');
77
const assert = require('assert');
88
const httpCommon = require('_http_common');
99
const { internalBinding } = require('internal/test/binding');
10+
const is_reused_symbol = require('internal/freelist').symbols.is_reused_symbol;
1011
const { HTTPParser } = internalBinding('http_parser');
1112
const net = require('net');
1213

@@ -25,7 +26,7 @@ function execAndClose() {
2526
process.stdout.write('.');
2627

2728
const parser = parsers.pop();
28-
parser.reinitialize(HTTPParser.RESPONSE, parser.needsAsyncReset);
29+
parser.reinitialize(HTTPParser.RESPONSE, parser[is_reused_symbol]);
2930

3031
const socket = net.connect(common.PORT);
3132
socket.on('error', (e) => {

0 commit comments

Comments
 (0)