diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2009-09-28 16:50:19 +0200 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2009-09-28 18:48:18 +0200 |
commit | 23c7f472d066087d8053e31e3797a91053a79d9a (patch) | |
tree | bed49cae3b2d4efa366fc0e035cd982eca3ce9da | |
parent | c27d9f986a01b86d30b11fd20a3dbd43251ec13a (diff) | |
download | nodejs-23c7f472d066087d8053e31e3797a91053a79d9a.tar.gz nodejs-23c7f472d066087d8053e31e3797a91053a79d9a.tar.bz2 nodejs-23c7f472d066087d8053e31e3797a91053a79d9a.zip |
API: Move node.exit() to process.exit().
-rw-r--r-- | benchmark/process_loop.js | 2 | ||||
-rw-r--r-- | doc/api.html | 89 | ||||
-rw-r--r-- | doc/api.txt | 67 | ||||
-rw-r--r-- | doc/api.xml | 92 | ||||
-rw-r--r-- | doc/node.1 | 83 | ||||
-rw-r--r-- | src/node.cc | 22 | ||||
-rw-r--r-- | src/node.js | 19 |
7 files changed, 189 insertions, 185 deletions
diff --git a/benchmark/process_loop.js b/benchmark/process_loop.js index ec971f095..2e1e35465 100644 --- a/benchmark/process_loop.js +++ b/benchmark/process_loop.js @@ -11,7 +11,7 @@ function next (i) { }); child.addListener("exit", function (code) { - if (code != 0) node.exit(-1); + if (code != 0) process.exit(-1); next(i - 1); }); } diff --git a/doc/api.html b/doc/api.html index b396955db..80feec48d 100644 --- a/doc/api.html +++ b/doc/api.html @@ -61,18 +61,10 @@ of the 16bit javascript string characters. Both are relatively fast—use them if you can. <tt>"utf8"</tt> is slower and should be avoided when possible.</p></div>
<div class="paragraph"><p>Unless otherwise noted, functions are all asynchronous and do not block
execution.</p></div>
-<h3 id="_helpers_and_global_variables">Helpers and Global Variables</h3><div style="clear:left"></div>
+<h3 id="_helpers">Helpers</h3><div style="clear:left"></div>
<div class="paragraph"><p>These objects are available to all programs.</p></div>
<div class="dlist"><dl>
<dt class="hdlist1">
-<tt>node.exit(code)</tt>
-</dt>
-<dd>
-<p>
-Immediately ends the process with the specified code.
-</p>
-</dd>
-<dt class="hdlist1">
<tt>node.cwd()</tt>
</dt>
<dd>
@@ -81,36 +73,73 @@ Returns the current working directory of the process. </p>
</dd>
<dt class="hdlist1">
-<tt>ARGV</tt>
+<tt>__filename</tt>
</dt>
<dd>
<p>
-An array containing the command line arguments.
+The filename of the script being executed.
</p>
</dd>
+</dl></div>
+<h3 id="_the_tt_process_tt_object">The <tt>process</tt> Object</h3><div style="clear:left"></div>
+<div class="paragraph"><p><tt>process</tt> is the equivalent of <tt>window</tt> in browser-side javascript. It is
+the global scope. <tt>process</tt> is an instance of <tt>node.EventEmitter</tt>.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="100%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<col width="7%" />
+<col width="15%" />
+<col width="76%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Event </th>
+<th align="left" valign="top"> Parameters </th>
+<th align="left" valign="top"> Notes</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table"><tt>"exit"</tt></p></td>
+<td align="left" valign="top"><p class="table"><tt>code</tt></p></td>
+<td align="left" valign="top"><p class="table">Made when the process exits.
+ A listener on this event should not try to perform
+ I/O since the process will forcibly exit in less
+ than microsecond. However, it is a good hook to
+ perform constant time checks of the module’s
+ state (like for unit tests).
+ <br />
+ The parameter <tt>code</tt> is the integer exit code
+ passed to <tt>process.exit()</tt>.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="dlist"><dl>
<dt class="hdlist1">
-<tt>ENV</tt>
+<tt>process.exit(code=0)</tt>
</dt>
<dd>
<p>
-An object containing the user environment. See environ(7).
+Ends the process with the specified code. By default it exits with the
+success code 0.
</p>
</dd>
<dt class="hdlist1">
-<tt>__filename</tt>
+<tt>process.ARGV</tt>
</dt>
<dd>
<p>
-The filename of the script being executed.
+An array containing the command line arguments.
</p>
</dd>
<dt class="hdlist1">
-<tt>process</tt>
+<tt>process.ENV</tt>
</dt>
<dd>
<p>
-A special global object. The <tt>process</tt> object is like the <tt>window</tt> object of
-browser-side javascript.
+An object containing the user environment. See environ(7).
</p>
</dd>
</dl></div>
@@ -475,28 +504,6 @@ variable (which should be a list of paths, colon separated).</p></div> is run. These are currently undocumented, but do look them up in your
system.</p></div>
<div class="paragraph"><p>(Functions <tt>require_async()</tt> and <tt>include_async()</tt> also exist.)</p></div>
-<h4 id="_tt_process_addlistener_exit_function_tt"><tt>process.addListener("exit", function () { })</tt></h4>
-<div class="paragraph"><p>When the program exits a special object called <tt>process</tt> will emit an
-<tt>"exit"</tt> event.</p></div>
-<div class="paragraph"><p>The <tt>"exit"</tt> event cannot perform I/O since the process is going to
-forcibly exit in less than microsecond. However, it is a good hook to
-perform constant time checks of the module’s state. E.G. for unit tests:</p></div>
-<div class="listingblock">
-<div class="content">
-<pre><tt>include("asserts.js");
-
-var timer_executed = false;
-
-setTimeout(function () {
- timer_executed = true
-}, 1000);
-
-process.addListener("exit", function () {
- assertTrue(timer_executed);
-});</tt></pre>
-</div></div>
-<div class="paragraph"><p>Just to reiterate: the <tt>"exit"</tt> event, is not the place to close files or
-shutdown servers. The process will exit before they get performed.</p></div>
<h3 id="_timers">Timers</h3><div style="clear:left"></div>
<div class="dlist"><dl>
<dt class="hdlist1">
@@ -1948,7 +1955,7 @@ init (Handle<Object> target) <div id="footer">
<div id="footer-text">
Version 0.1.12<br />
-Last updated 2009-09-28 16:05:24 CEST
+Last updated 2009-09-28 16:33:21 CEST
</div>
</div>
</body>
diff --git a/doc/api.txt b/doc/api.txt index 141be0dd9..4a1f7fb17 100644 --- a/doc/api.txt +++ b/doc/api.txt @@ -47,29 +47,44 @@ Unless otherwise noted, functions are all asynchronous and do not block execution. -=== Helpers and Global Variables +=== Helpers These objects are available to all programs. -+node.exit(code)+:: -Immediately ends the process with the specified code. - +node.cwd()+:: Returns the current working directory of the process. -+ARGV+ :: -An array containing the command line arguments. - -+ENV+ :: -An object containing the user environment. See environ(7). - +__filename+ :: The filename of the script being executed. -+process+ :: -A special global object. The +process+ object is like the +window+ object of -browser-side javascript. +=== The +process+ Object ++process+ is the equivalent of +window+ in browser-side javascript. It is +the global scope. +process+ is an instance of +node.EventEmitter+. + +[cols="1,2,10",options="header"] +|========================================================= +| Event | Parameters | Notes +| +"exit"+ | +code+ | Made when the process exits. + A listener on this event should not try to perform + I/O since the process will forcibly exit in less + than microsecond. However, it is a good hook to + perform constant time checks of the module's + state (like for unit tests). + + + The parameter +code+ is the integer exit code + passed to +process.exit()+. +|========================================================= + ++process.exit(code=0)+:: +Ends the process with the specified code. By default it exits with the +success code 0. + ++process.ARGV+ :: +An array containing the command line arguments. + ++process.ENV+ :: +An object containing the user environment. See environ(7). === Utilities @@ -306,32 +321,6 @@ system. (Functions +require_async()+ and +include_async()+ also exist.) -==== +process.addListener("exit", function () { })+ - -When the program exits a special object called +process+ will emit an -+"exit"+ event. - -The +"exit"+ event cannot perform I/O since the process is going to -forcibly exit in less than microsecond. However, it is a good hook to -perform constant time checks of the module's state. E.G. for unit tests: - ----------------------------------------- -include("asserts.js"); - -var timer_executed = false; - -setTimeout(function () { - timer_executed = true -}, 1000); - -process.addListener("exit", function () { - assertTrue(timer_executed); -}); ----------------------------------------- - -Just to reiterate: the +"exit"+ event, is not the place to close files or -shutdown servers. The process will exit before they get performed. - === Timers diff --git a/doc/api.xml b/doc/api.xml index 311ec9c8a..1ce13fcd4 100644 --- a/doc/api.xml +++ b/doc/api.xml @@ -33,22 +33,12 @@ of the 16bit javascript string characters. Both are relatively fast—use them if you can. <literal>"utf8"</literal> is slower and should be avoided when possible.</simpara>
<simpara>Unless otherwise noted, functions are all asynchronous and do not block
execution.</simpara>
-<refsect2 id="_helpers_and_global_variables">
-<title>Helpers and Global Variables</title>
+<refsect2 id="_helpers">
+<title>Helpers</title>
<simpara>These objects are available to all programs.</simpara>
<variablelist>
<varlistentry>
<term>
-<literal>node.exit(code)</literal>
-</term>
-<listitem>
-<simpara>
-Immediately ends the process with the specified code.
-</simpara>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
<literal>node.cwd()</literal>
</term>
<listitem>
@@ -59,42 +49,81 @@ Returns the current working directory of the process. </varlistentry>
<varlistentry>
<term>
-<literal>ARGV</literal>
+<literal>__filename</literal>
</term>
<listitem>
<simpara>
-An array containing the command line arguments.
+The filename of the script being executed.
</simpara>
</listitem>
</varlistentry>
+</variablelist>
+</refsect2>
+<refsect2 id="_the_literal_process_literal_object">
+<title>The <literal>process</literal> Object</title>
+<simpara><literal>process</literal> is the equivalent of <literal>window</literal> in browser-side javascript. It is
+the global scope. <literal>process</literal> is an instance of <literal>node.EventEmitter</literal>.</simpara>
+<informaltable
+frame="all"
+rowsep="1" colsep="1"
+>
+<tgroup cols="3">
+<colspec colname="col_1" colwidth="7*"/>
+<colspec colname="col_2" colwidth="15*"/>
+<colspec colname="col_3" colwidth="76*"/>
+<thead>
+<row>
+<entry align="left" valign="top"> Event </entry>
+<entry align="left" valign="top"> Parameters </entry>
+<entry align="left" valign="top"> Notes</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry align="left" valign="top"><simpara><literal>"exit"</literal></simpara></entry>
+<entry align="left" valign="top"><simpara><literal>code</literal></simpara></entry>
+<entry align="left" valign="top"><simpara>Made when the process exits.
+ A listener on this event should not try to perform
+ I/O since the process will forcibly exit in less
+ than microsecond. However, it is a good hook to
+ perform constant time checks of the module’s
+ state (like for unit tests).
+ <?asciidoc-br?>
+ The parameter <literal>code</literal> is the integer exit code
+ passed to <literal>process.exit()</literal>.</simpara></entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+<variablelist>
<varlistentry>
<term>
-<literal>ENV</literal>
+<literal>process.exit(code=0)</literal>
</term>
<listitem>
<simpara>
-An object containing the user environment. See environ(7).
+Ends the process with the specified code. By default it exits with the
+success code 0.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
-<literal>__filename</literal>
+<literal>process.ARGV</literal>
</term>
<listitem>
<simpara>
-The filename of the script being executed.
+An array containing the command line arguments.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
-<literal>process</literal>
+<literal>process.ENV</literal>
</term>
<listitem>
<simpara>
-A special global object. The <literal>process</literal> object is like the <literal>window</literal> object of
-browser-side javascript.
+An object containing the user environment. See environ(7).
</simpara>
</listitem>
</varlistentry>
@@ -488,27 +517,6 @@ variable (which should be a list of paths, colon separated).</simpara> is run. These are currently undocumented, but do look them up in your
system.</simpara>
<simpara>(Functions <literal>require_async()</literal> and <literal>include_async()</literal> also exist.)</simpara>
-<refsect3 id="_literal_process_addlistener_exit_function_literal">
-<title><literal>process.addListener("exit", function () { })</literal></title>
-<simpara>When the program exits a special object called <literal>process</literal> will emit an
-<literal>"exit"</literal> event.</simpara>
-<simpara>The <literal>"exit"</literal> event cannot perform I/O since the process is going to
-forcibly exit in less than microsecond. However, it is a good hook to
-perform constant time checks of the module’s state. E.G. for unit tests:</simpara>
-<screen>include("asserts.js");
-
-var timer_executed = false;
-
-setTimeout(function () {
- timer_executed = true
-}, 1000);
-
-process.addListener("exit", function () {
- assertTrue(timer_executed);
-});</screen>
-<simpara>Just to reiterate: the <literal>"exit"</literal> event, is not the place to close files or
-shutdown servers. The process will exit before they get performed.</simpara>
-</refsect3>
</refsect2>
<refsect2 id="_timers">
<title>Timers</title>
diff --git a/doc/node.1 b/doc/node.1 index 1b08915ea..836c307d6 100644 --- a/doc/node.1 +++ b/doc/node.1 @@ -42,41 +42,58 @@ Node supports 3 string encodings\. UTF\-8 ("utf8"), ASCII ("ascii"), and Binary .sp Unless otherwise noted, functions are all asynchronous and do not block execution\. .sp -.SS "Helpers and Global Variables" +.SS "Helpers" These objects are available to all programs\. .PP -node\.exit(code) -.RS 4 -Immediately ends the process with the specified code\. -.RE -.PP node\.cwd() .RS 4 Returns the current working directory of the process\. .RE .PP -ARGV +__filename .RS 4 -An array containing the command line arguments\. +The filename of the script being executed\. .RE +.SS "The process Object" +process is the equivalent of window in browser\-side javascript\. It is the global scope\. process is an instance of node\.EventEmitter\. +.sp +.TS +allbox tab(:); +ltB ltB ltBx. +T{ +Event +T}:T{ +Parameters +T}:T{ +Notes +T} +.T& +lt lt lt. +T{ +"exit" +.sp +T}:T{ +code +.sp +T}:T{ +Made when the process exits\. A listener on this event should not try to perform I/O since the process will forcibly exit in less than microsecond\. However, it is a good hook to perform constant time checks of the module\(cqs state (like for unit tests)\. The parameter code is the integer exit code passed to process\.exit()\. +.sp +T} +.TE .PP -ENV +process\.exit(code=0) .RS 4 -An object containing the user environment\. See environ(7)\. +Ends the process with the specified code\. By default it exits with the success code 0\. .RE .PP -__filename +process\.ARGV .RS 4 -The filename of the script being executed\. +An array containing the command line arguments\. .RE .PP -process +process\.ENV .RS 4 -A special global object\. The -process -object is like the -window -object of browser\-side javascript\. +An object containing the user environment\. See environ(7)\. .RE .SS "Utilities" These function are in "/utils\.js"\. Use require("/utils\.js") to access them\. @@ -418,36 +435,6 @@ Node comes with several libraries which are installed when "make install" is run .sp (Functions require_async() and include_async() also exist\.) .sp -.sp -.it 1 an-trap -.nr an-no-space-flag 1 -.nr an-break-flag 1 -.br -process.addListener("exit", function () { }) -.RS -When the program exits a special object called process will emit an "exit" event\. -.sp -The "exit" event cannot perform I/O since the process is going to forcibly exit in less than microsecond\. However, it is a good hook to perform constant time checks of the module\(cqs state\. E\.G\. for unit tests: -.sp -.sp -.RS 4 -.nf -include("asserts\.js"); - -var timer_executed = false; - -setTimeout(function () { - timer_executed = true -}, 1000); - -process\.addListener("exit", function () { - assertTrue(timer_executed); -}); -.fi -.RE -Just to reiterate: the "exit" event, is not the place to close files or shutdown servers\. The process will exit before they get performed\. -.sp -.RE .SS "Timers" .PP setTimeout(callback, delay) diff --git a/src/node.cc b/src/node.cc index e1eabe421..f452f6602 100644 --- a/src/node.cc +++ b/src/node.cc @@ -408,15 +408,23 @@ static Local<Object> Load(int argc, char *argv[]) { return scope.Close(node_obj); } -static void CallExitHandler(Handle<Object> node_obj) { +static void CallExitHandler() { HandleScope scope; - Local<Value> exit_v = node_obj->Get(String::New("exit")); - assert(exit_v->IsFunction()); - Handle<Function> exit_f = Handle<Function>::Cast(exit_v); + Local<Object> process = Context::GetCurrent()->Global(); + Local<Value> emit_v = process->Get(String::NewSymbol("emit")); + if (!emit_v->IsFunction()) { + exit(10); // could not emit exit event so exit with error code 10. + } + Local<Function> emit = Local<Function>::Cast(emit_v); + TryCatch try_catch; - exit_f->Call(Context::GetCurrent()->Global(), 0, NULL); - if (try_catch.HasCaught()) + + Local<Value> argv[2] = { String::New("exit"), Integer::New(0) }; + emit->Call(process, 2, argv); + + if (try_catch.HasCaught()) { node::FatalException(try_catch); + } } static void PrintHelp() { @@ -494,7 +502,7 @@ int main(int argc, char *argv[]) { ev_loop(EV_DEFAULT_UC_ 0); // main event loop - node::CallExitHandler(node_obj); + node::CallExitHandler(); context.Dispose(); V8::Dispose(); diff --git a/src/node.js b/src/node.js index 917a15daa..8922e2dfe 100644 --- a/src/node.js +++ b/src/node.js @@ -202,7 +202,7 @@ node.Module.prototype.loadObject = function (loadPromise) { loadPromise.emitSuccess(self.target); } else { loadPromise.emitError(new Error("Error reading " + self.filename)); - node.exit(1); + process.exit(1); } }); }; @@ -213,7 +213,7 @@ node.Module.prototype.loadScript = function (loadPromise) { catPromise.addErrback(function () { loadPromise.emitError(new Error("Error reading " + self.filename)); - node.exit(1); + process.exit(1); }); catPromise.addCallback(function (content) { @@ -256,6 +256,16 @@ node.Module.prototype.waitChildrenLoad = function (callback) { if (children.length == nloaded && callback) callback(); }; + +process.exit = function (code) { + process.emit("exit"); + node.reallyExit(code); +}; + +node.exit = function (code) { + throw new Error("process.exit() has been renamed to process.exit()."); +}; + (function () { var cwd = node.cwd(); @@ -270,9 +280,4 @@ node.Module.prototype.waitChildrenLoad = function (callback) { // Load the root module--the command line argument. node.loadModule(ARGV[1], process); - - node.exit = function (code) { - process.emit("exit"); - node.reallyExit(code); - }; }()); |