summaryrefslogtreecommitdiff
path: root/lib/internal/freelist.js
blob: 04d684e8334ff58a6c18fb176119bf770a89afb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'use strict';

const is_reused_symbol = Symbol('isReused');

class FreeList {
  constructor(name, max, ctor) {
    this.name = name;
    this.ctor = ctor;
    this.max = max;
    this.list = [];
  }

  alloc() {
    let item;
    if (this.list.length > 0) {
      item = this.list.pop();
      item[is_reused_symbol] = true;
    } else {
      item = this.ctor.apply(this, arguments);
      item[is_reused_symbol] = false;
    }
    return item;
  }

  free(obj) {
    if (this.list.length < this.max) {
      this.list.push(obj);
      return true;
    }
    return false;
  }
}

module.exports = {
  FreeList,
  symbols: {
    is_reused_symbol
  }
};