summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2009-09-28 16:50:19 +0200
committerRyan Dahl <ry@tinyclouds.org>2009-09-28 18:48:18 +0200
commit23c7f472d066087d8053e31e3797a91053a79d9a (patch)
treebed49cae3b2d4efa366fc0e035cd982eca3ce9da
parentc27d9f986a01b86d30b11fd20a3dbd43251ec13a (diff)
downloadnodejs-23c7f472d066087d8053e31e3797a91053a79d9a.tar.gz
nodejs-23c7f472d066087d8053e31e3797a91053a79d9a.tar.bz2
nodejs-23c7f472d066087d8053e31e3797a91053a79d9a.zip
API: Move node.exit() to process.exit().
-rw-r--r--benchmark/process_loop.js2
-rw-r--r--doc/api.html89
-rw-r--r--doc/api.txt67
-rw-r--r--doc/api.xml92
-rw-r--r--doc/node.183
-rw-r--r--src/node.cc22
-rw-r--r--src/node.js19
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&#8212;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&#8217;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&#8217;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&lt;Object&gt; 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&#8212;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&#8217;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&#8217;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);
- };
}());