Bug 1389381: Part 2 - Add slop to the maximum size of a LimitedSet. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Sat, 12 Aug 2017 11:08:35 -0700
changeset 645323 767c494324db1160a24a76ae82947ed5ff1fd9dd
parent 645101 cae004dbbc0e477fa18d2abc829ab711be81a782
child 645324 11eb975e303a8abbcb3b5689407693fdf7cbd77e
push id73747
push usermaglione.k@gmail.com
push dateSat, 12 Aug 2017 18:12:29 +0000
reviewersaswan
bugs1389381
milestone57.0a1
Bug 1389381: Part 2 - Add slop to the maximum size of a LimitedSet. r?aswan Truncating a Set can be relatively expensive, so truncating only after several excessive entries have been added can save some cycles. MozReview-Commit-ID: DIAXQ3ow2fa
toolkit/components/extensions/ExtensionUtils.jsm
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -256,34 +256,43 @@ class EventEmitter {
 
     return Promise.all(promises);
   }
 }
 
 /**
  * A set with a limited number of slots, which flushes older entries as
  * newer ones are added.
+ *
+ * @param {integer} limit
+ *        The maximum size to trim the set to after it grows too large.
+ * @param {integer} [slop = limit * .25]
+ *        The number of extra entries to allow in the set after it
+ *        reaches the size limit, before it is truncated to the limit.
+ * @param {iterable} [iterable]
+ *        An iterable of initial entries to add to the set.
  */
 class LimitedSet extends Set {
-  constructor(limit, iterable = undefined) {
+  constructor(limit, slop = Math.round(limit * .25), iterable = undefined) {
     super(iterable);
     this.limit = limit;
+    this.slop = slop;
   }
 
   truncate(limit) {
     for (let item of this) {
       if (this.size <= limit) {
         break;
       }
       this.delete(item);
     }
   }
 
   add(item) {
-    if (!this.has(item) && this.size >= this.limit) {
+    if (!this.has(item) && this.size >= this.limit + this.slop) {
       this.truncate(this.limit - 1);
     }
     super.add(item);
   }
 }
 
 /**
  * Returns a Promise which resolves when the given document's DOM has