diff --git a/app/atom_main.cc b/app/atom_main.cc index e868a63a6d..0dfeb386a3 100644 --- a/app/atom_main.cc +++ b/app/atom_main.cc @@ -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 #include #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(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(argv)); return AtomMain(argc, argv); } diff --git a/spec/fixtures/module/fork_ping.js b/spec/fixtures/module/fork_ping.js new file mode 100644 index 0000000000..e6d3f921ba --- /dev/null +++ b/spec/fixtures/module/fork_ping.js @@ -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); +}); diff --git a/spec/node/child_process.coffee b/spec/node/child_process.coffee index 2246391b8c..6d0c1dbe5e 100644 --- a/spec/node/child_process.coffee +++ b/spec/node/child_process.coffee @@ -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' diff --git a/vendor/node b/vendor/node index de1afc6cc6..c2ecf615ac 160000 --- a/vendor/node +++ b/vendor/node @@ -1 +1 @@ -Subproject commit de1afc6cc609ed37863b1b0e919357f96000c6c4 +Subproject commit c2ecf615ac2bb846a38ffa0b64e9ce0ff4f8953b