Skip to content
This repository was archived by the owner on Nov 15, 2017. It is now read-only.

Commit 83d505a

Browse files
committed
saner job handler timer
1 parent 6df38ac commit 83d505a

File tree

1 file changed

+90
-61
lines changed

1 file changed

+90
-61
lines changed

js/async.js

Lines changed: 90 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,78 +19,107 @@
1919
Home: https://github.com/gorhill/httpswitchboard
2020
*/
2121

22+
/* global chrome, HTTPSB */
23+
2224
/******************************************************************************/
2325

2426
// Async job queue module
2527

26-
(function() {
27-
28-
var timeResolution = 200;
29-
var jobs = {};
30-
var jobCount = 0;
31-
var jobJunkyard = [];
32-
33-
var asyncJobEntry = function(name) {
34-
this.name = name;
35-
this.data = null;
36-
this.callback = null;
37-
this.when = 0;
38-
this.period = 0;
39-
};
28+
HTTPSB.asyncJobs = (function() {
29+
30+
var timeResolution = 200;
31+
var jobs = {};
32+
var jobCount = 0;
33+
var jobJunkyard = [];
34+
var timerId = null;
35+
var timerWhen = Number.MAX_VALUE;
36+
37+
var AsyncJobEntry = function(name) {
38+
this.name = name;
39+
this.data = null;
40+
this.callback = null;
41+
this.when = 0;
42+
this.period = 0;
43+
};
44+
45+
AsyncJobEntry.prototype.destroy = function() {
46+
this.name = '';
47+
this.data = null;
48+
this.callback = null;
49+
};
50+
51+
var restartTimer = function() {
52+
var when = Number.MAX_VALUE;
53+
var job;
54+
for ( var jobName in jobs ) {
55+
if ( jobs.hasOwnProperty(jobName) === false ) {
56+
continue;
57+
}
58+
job = jobs[jobName];
59+
if ( job.when < when ) {
60+
when = job.when;
61+
}
62+
}
63+
// Quantize time value
64+
when = Math.floor((when + timeResolution - 1) / timeResolution) * timeResolution;
4065

41-
asyncJobEntry.prototype.destroy = function() {
42-
this.name = '';
43-
this.data = null;
44-
this.callback = null;
45-
};
66+
if ( when < timerWhen ) {
67+
clearTimeout(timerId);
68+
timerWhen = when;
69+
timerId = setTimeout(processJobs, Math.max(when - Date.now(), 10));
70+
}
71+
};
4672

47-
var addJob = function(name, data, callback, delay, recurrent) {
48-
var job = jobs[name];
73+
var addJob = function(name, data, callback, delay, recurrent) {
74+
var job = jobs[name];
75+
if ( !job ) {
76+
job = jobJunkyard.pop();
4977
if ( !job ) {
50-
job = jobJunkyard.pop();
51-
if ( !job ) {
52-
job = new asyncJobEntry(name);
53-
} else {
54-
job.name = name;
55-
}
56-
jobs[name] = job;
57-
jobCount++;
78+
job = new AsyncJobEntry(name);
79+
} else {
80+
job.name = name;
5881
}
59-
job.data = data;
60-
job.callback = callback;
61-
job.when = Date.now() + delay;
62-
job.period = recurrent ? delay : 0;
63-
};
64-
65-
var processJobs = function() {
66-
var now = Date.now();
67-
var job;
68-
for ( var jobName in jobs ) {
69-
if ( jobs.hasOwnProperty(jobName) === false ) {
70-
continue;
71-
}
72-
job = jobs[jobName];
73-
if ( job.when > now ) {
74-
continue;
75-
}
76-
job.callback(job.data);
77-
if ( job.period ) {
78-
job.when = now + job.period;
79-
} else {
80-
delete jobs[jobName];
81-
job.destroy();
82-
jobCount--;
83-
jobJunkyard.push(job);
84-
}
82+
jobs[name] = job;
83+
jobCount++;
84+
}
85+
job.data = data;
86+
job.callback = callback;
87+
job.when = Date.now() + delay;
88+
job.period = recurrent ? delay : 0;
89+
restartTimer();
90+
};
91+
92+
var processJobs = function() {
93+
timerId = null;
94+
timerWhen = Number.MAX_VALUE;
95+
var now = Date.now();
96+
var job;
97+
for ( var jobName in jobs ) {
98+
if ( jobs.hasOwnProperty(jobName) === false ) {
99+
continue;
85100
}
86-
};
101+
job = jobs[jobName];
102+
if ( job.when > now ) {
103+
continue;
104+
}
105+
job.callback(job.data);
106+
if ( job.period ) {
107+
job.when = now + job.period;
108+
} else {
109+
delete jobs[jobName];
110+
job.destroy();
111+
jobCount--;
112+
jobJunkyard.push(job);
113+
}
114+
}
115+
restartTimer();
116+
};
87117

88-
setInterval(processJobs, timeResolution);
118+
// Publish async jobs module
119+
return {
120+
add: addJob
121+
};
89122

90-
// Publish async jobs module
91-
HTTPSB.asyncJobs = {
92-
add: addJob
93-
};
94123
})();
95124

96125
/******************************************************************************/

0 commit comments

Comments
 (0)