Skip to content

Commit 35dd5c7

Browse files
committed
Merge branch 'chrisboulton_master' Raise "close" event when worker processes terminate
cramforce#4
2 parents 0fe3dd2 + 0cba67e commit 35dd5c7

File tree

5 files changed

+46
-9
lines changed

5 files changed

+46
-9
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ http://www.whatwg.org/specs/web-workers/current-work/
2222
worker.terminate();
2323
});
2424

25+
// Optional, if you want to be notified when a worker child exits
26+
worker.addListener('close', function(code) {
27+
sys.puts('Worker exited with exit code ' + code);
28+
});
29+
2530
## Example Worker File
2631

2732
var worker = require("worker").worker;

example/example.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,8 @@ worker.onmessage = function (msg) {
1515
worker.addListener("message", function (msg) {
1616
sys.puts(msg.hello);
1717
worker.terminate();
18+
});
19+
20+
worker.addListener('close', function(code) {
21+
sys.puts('Worker exited with exit code ' + code);
1822
});

lib/worker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ function WorkerChild (eventDest, filename) {
7373

7474
this.child.addListener("exit", function (code) {
7575
debug(self.child.pid + ": exit "+code);
76-
self.eventDest.emit("close", code);
76+
self.eventDest.emit("close", code);
7777
});
7878

7979
this.buffer = "";

test/fixtures/worker.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ worker.onmessage = function (msg) {
2020
if(msg.error) {
2121
throw("ErrorMarker");
2222
}
23+
24+
if(msg.exitCode) {
25+
process.exit(msg.exitCode);
26+
return;
27+
}
2328

2429
msg.output = msg.input * 3;
2530
setTimeout(function () {

test/test-worker.js

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
var common = require("./common");
22
var sys = require("sys");
33
var assert = require('assert');
4-
4+
55
var Worker = require("../lib/worker").Worker;
6-
6+
77
process.ENV["NODE_PATH"] = common.libDir;
8-
8+
99
function makeWorker (filename) {
1010
return new Worker(__dirname+"/fixtures/"+filename);
1111
}
1212

1313
// basic test
1414
var worker = makeWorker("worker.js");
15-
15+
1616
worker.onmessage = function (msg) {
1717
if (msg.input) {
1818
assert.ok(msg.output == msg.input * 3, "We can multiply asyncly");
@@ -21,7 +21,7 @@ worker.onmessage = function (msg) {
2121
}
2222
}
2323
};
24-
24+
2525
worker.postMessage({
2626
input: 1
2727
});
@@ -38,7 +38,7 @@ worker.postMessage({
3838
// error handling
3939
setTimeout(function () {
4040
setTimeout(function () {
41-
41+
4242
var w2 = makeWorker("worker.js");
4343
w2.postMessage({
4444
error: true
@@ -51,7 +51,7 @@ setTimeout(function () {
5151
assert.ok(false, "Wanted an error, but got a message");
5252
w2.terminate();
5353
});
54-
54+
5555
var w3 = makeWorker("worker.js");
5656
w3.postMessage({
5757
error: true
@@ -64,7 +64,7 @@ setTimeout(function () {
6464
assert.ok(false, "Wanted an error, but got a message");
6565
w3.terminate();
6666
});
67-
67+
6868
}, 10);
6969
}, 10);
7070

@@ -112,4 +112,27 @@ waitWorker.postMessage({
112112
waitWorker.addListener("message", function () {
113113
assert.ok(true, "Worker response can be async.")
114114
waitWorker.terminate();
115+
});
116+
117+
// Test workers raise "close" event when they exit
118+
var workersClosed = 0;
119+
var exitWorker = makeWorker('worker.js');
120+
exitWorker.postMessage({
121+
exitCode: 1,
122+
});
123+
exitWorker.addListener('close', function(code) {
124+
assert.ok(code === 1, 'Exited worker returns exit code');
125+
++workersClosed;
126+
});
127+
128+
// Test that when a worker raises a syntax error, it raises a close event
129+
var exitWorker = makeWorker('syntax-error-worker.js');
130+
exitWorker.onerror = function() { };
131+
exitWorker.addListener('close', function(code) {
132+
assert.ok(true, 'Worker with syntax error raises close event');
133+
++workersClosed;
134+
});
135+
136+
process.addListener('exit', function () {
137+
assert.ok(workersClosed == 2, "Exited workers raise 'close' event");
115138
});

0 commit comments

Comments
 (0)