Skip to content

Commit a5d8945

Browse files
AndrasFishrock123
authored andcommitted
timers: optimize linkedlist
Now uses a new L.create() factory to create access-optimized linkedlist objects. PR-URL: #6436 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
1 parent e727cb5 commit a5d8945

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

lib/internal/linkedlist.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ function init(list) {
66
}
77
exports.init = init;
88

9+
// create a new linked list
10+
function create() {
11+
var list = { _idleNext: null, _idlePrev: null };
12+
init(list);
13+
return list;
14+
}
15+
exports.create = create;
916

1017
// show the most idle item
1118
function peek(list) {
@@ -42,10 +49,17 @@ exports.remove = remove;
4249

4350
// remove a item from its list and place at the end.
4451
function append(list, item) {
45-
remove(item);
52+
if (item._idleNext || item._idlePrev) {
53+
remove(item);
54+
}
55+
56+
// items are linked with _idleNext -> (older) and _idlePrev -> (newer)
57+
// TODO: swap the linkage to match the intuitive older items at "prev"
4658
item._idleNext = list._idleNext;
47-
list._idleNext._idlePrev = item;
4859
item._idlePrev = list;
60+
61+
// the list _idleNext points to tail (newest) and _idlePrev to head (oldest)
62+
list._idleNext._idlePrev = item;
4963
list._idleNext = item;
5064
}
5165
exports.append = append;

lib/timers.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,16 +502,14 @@ Timeout.prototype.close = function() {
502502
};
503503

504504

505-
var immediateQueue = {};
506-
L.init(immediateQueue);
505+
var immediateQueue = L.create();
507506

508507

509508
function processImmediate() {
510509
var queue = immediateQueue;
511510
var domain, immediate;
512511

513-
immediateQueue = {};
514-
L.init(immediateQueue);
512+
immediateQueue = L.create();
515513

516514
while (L.isEmpty(queue) === false) {
517515
immediate = L.shift(queue);

test/parallel/test-timers-linked-list.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,8 @@ assert.equal(C, L.shift(list));
103103
// list
104104
assert.ok(L.isEmpty(list));
105105

106+
var list2 = L.create();
107+
var list3 = L.create();
108+
assert.ok(L.isEmpty(list2));
109+
assert.ok(L.isEmpty(list3));
110+
assert.ok(list2 != list3);

0 commit comments

Comments
 (0)