Merge pull request #84 from atom/nested-fork

Use environment variable to detect whether to run as node.

Fixed # 83.
This commit is contained in:
Cheng Zhao 2013-09-04 18:55:20 -07:00
commit a3e5b21118
4 changed files with 35 additions and 8 deletions

View file

@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdlib.h>
#include <string.h>
#include "content/public/app/content_main.h"
@ -22,7 +23,8 @@ int Start(int argc, char *argv[]);
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
int argc = 0;
wchar_t** wargv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
if (argc > 1 && wcscmp(wargv[1], L"--atom-child_process-fork") == 0) {
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0)
// Convert argv to to UTF8
char** argv = new char*[argc];
for (int i = 0; i < argc; i++) {
@ -57,8 +59,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
}
}
// Now that conversion is done, we can finally start.
argv[1] = argv[0];
return node::Start(argc - 1, argv + 1);
return node::Start(argc, argv);
}
sandbox::SandboxInterfaceInfo sandbox_info = {0};
@ -72,10 +73,9 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
#include "app/atom_library_main.h"
int main(int argc, const char* argv[]) {
if (argc > 1 && strcmp(argv[1], "--atom-child_process-fork") == 0) {
argv[1] = argv[0];
return node::Start(argc - 1, const_cast<char**>(argv + 1));
}
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0)
return node::Start(argc, const_cast<char**>(argv));
return AtomMain(argc, argv);
}

11
spec/fixtures/module/fork_ping.js vendored Normal file
View file

@ -0,0 +1,11 @@
process.on('uncaughtException', function(error) {
process.send(error.stack);
});
var child = require('child_process').fork(__dirname + '/ping.js');
process.on('message', function(msg) {
child.send(msg);
});
child.on('message', function (msg) {
process.send(msg);
});

View file

@ -12,3 +12,19 @@ describe 'child_process', ->
assert.equal msg, 'message'
done()
child.send 'message'
it 'should work in forked process', (done) ->
child = child_process.fork path.join(fixtures, 'module', 'fork_ping.js')
child.on 'message', (msg) ->
assert.equal msg, 'message'
done()
child.send 'message'
it 'should work in forked process when options.env is specifed', (done) ->
child = child_process.fork path.join(fixtures, 'module', 'fork_ping.js'),
[],
env: {test: 'somevar'}
child.on 'message', (msg) ->
assert.equal msg, 'message'
done()
child.send 'message'

2
vendor/node vendored

@ -1 +1 @@
Subproject commit de1afc6cc609ed37863b1b0e919357f96000c6c4
Subproject commit c2ecf615ac2bb846a38ffa0b64e9ce0ff4f8953b