Browse Source

timers: optimize linkedlist

Now uses a new L.create() factory to create access-optimized linkedlist
objects.

PR-URL: https://github.com/nodejs/node/pull/6436
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
v6.x
Andras 9 years ago
committed by Jeremiah Senkpiel
parent
commit
a5d894590d
  1. 16
      lib/internal/linkedlist.js
  2. 6
      lib/timers.js
  3. 5
      test/parallel/test-timers-linked-list.js

16
lib/internal/linkedlist.js

@ -6,6 +6,13 @@ function init(list) {
} }
exports.init = init; exports.init = init;
// create a new linked list
function create() {
var list = { _idleNext: null, _idlePrev: null };
init(list);
return list;
}
exports.create = create;
// show the most idle item // show the most idle item
function peek(list) { function peek(list) {
@ -42,10 +49,17 @@ exports.remove = remove;
// remove a item from its list and place at the end. // remove a item from its list and place at the end.
function append(list, item) { function append(list, item) {
if (item._idleNext || item._idlePrev) {
remove(item); remove(item);
}
// items are linked with _idleNext -> (older) and _idlePrev -> (newer)
// TODO: swap the linkage to match the intuitive older items at "prev"
item._idleNext = list._idleNext; item._idleNext = list._idleNext;
list._idleNext._idlePrev = item;
item._idlePrev = list; item._idlePrev = list;
// the list _idleNext points to tail (newest) and _idlePrev to head (oldest)
list._idleNext._idlePrev = item;
list._idleNext = item; list._idleNext = item;
} }
exports.append = append; exports.append = append;

6
lib/timers.js

@ -502,16 +502,14 @@ Timeout.prototype.close = function() {
}; };
var immediateQueue = {}; var immediateQueue = L.create();
L.init(immediateQueue);
function processImmediate() { function processImmediate() {
var queue = immediateQueue; var queue = immediateQueue;
var domain, immediate; var domain, immediate;
immediateQueue = {}; immediateQueue = L.create();
L.init(immediateQueue);
while (L.isEmpty(queue) === false) { while (L.isEmpty(queue) === false) {
immediate = L.shift(queue); immediate = L.shift(queue);

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

@ -103,3 +103,8 @@ assert.equal(C, L.shift(list));
// list // list
assert.ok(L.isEmpty(list)); assert.ok(L.isEmpty(list));
var list2 = L.create();
var list3 = L.create();
assert.ok(L.isEmpty(list2));
assert.ok(L.isEmpty(list3));
assert.ok(list2 != list3);

Loading…
Cancel
Save