diff --git a/.gitignore b/.gitignore
index 0ff301ace3824d..a9d428ad6abafc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -122,3 +122,8 @@ deps/uv/docs/src/guide/
# do not override V8's .gitignore
!deps/v8/**
+# ignore VS compiler output unhandled by V8's .gitignore
+deps/v8/src/Debug/
+deps/v8/src/Release/
+deps/v8/src/inspector/Debug/
+deps/v8/src/inspector/Release/
diff --git a/COLLABORATOR_GUIDE.md b/COLLABORATOR_GUIDE.md
index 95ef0653552c1e..e08c84e77cbc11 100644
--- a/COLLABORATOR_GUIDE.md
+++ b/COLLABORATOR_GUIDE.md
@@ -21,6 +21,7 @@
- [Deprecations](#deprecations)
- [Involving the TSC](#involving-the-tsc)
* [Landing Pull Requests](#landing-pull-requests)
+ - [Using `git-node`](#using-git-node)
- [Technical HOWTO](#technical-howto)
- [Troubleshooting](#troubleshooting)
- [I Just Made a Mistake](#i-just-made-a-mistake)
@@ -454,6 +455,26 @@ Additionally:
- All commits should be self-contained (meaning every commit should pass all
tests). This makes it much easier when bisecting to find a breaking change.
+### Using `git-node`
+
+In most cases, using [the `git-node` command][git-node] of [`node-core-utils`][]
+should be enough to help you land a Pull Request. If you discover a problem when
+using this tool, please file an issue
+[to the issue tracker][node-core-utils-issues].
+
+Quick example:
+
+```text
+$ npm install -g node-core-utils
+$ git node land $PRID
+```
+
+If it's the first time you ever use `node-core-utils`, you will be prompted
+to type the password of your GitHub account in the console so the tool can
+create the GitHub access token for you. If you do not want to do that, follow
+[the guide of `node-core-utils`][node-core-utils-credentials]
+to set up your credentials manually.
+
### Technical HOWTO
Clear any `am`/`rebase` that may already be underway:
@@ -569,7 +590,8 @@ commit logs, ensure that they are properly formatted, and add
* Modify the original commit message to include additional metadata regarding
- the change process. ([`node-core-utils`][] fetches the metadata for you.)
+ the change process. (The [`git node metadata`][git-node-metadata] command
+ can generate the metadata for you.)
* Required: A `PR-URL:` line that references the *full* GitHub URL of the
original pull request being merged so it's easy to trace a commit back to
@@ -748,6 +770,10 @@ LTS working group and the Release team.
[Stability Index]: doc/api/documentation.md#stability-index
[Enhancement Proposal]: https://github.com/nodejs/node-eps
[`--pending-deprecation`]: doc/api/cli.md#--pending-deprecation
+[git-node]: https://github.com/nodejs/node-core-utils/blob/master/docs/git-node.md
+[git-node-metadata]: https://github.com/nodejs/node-core-utils/blob/master/docs/git-node.md#git-node-metadata
[git-username]: https://help.github.com/articles/setting-your-username-in-git/
[`node-core-utils`]: https://github.com/nodejs/node-core-utils
[TSC]: https://github.com/nodejs/TSC
+[node-core-utils-issues]: https://github.com/nodejs/node-core-utils/issues
+[node-core-utils-credentials]: https://github.com/nodejs/node-core-utils#setting-up-credentials
diff --git a/README.md b/README.md
index 687f0fb4723862..9dda47e821fc68 100644
--- a/README.md
+++ b/README.md
@@ -3,9 +3,6 @@
-
-
-
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. For
more information on using Node.js, see the
diff --git a/benchmark/url/url-parse.js b/benchmark/url/url-parse.js
new file mode 100644
index 00000000000000..83f626ccdadfe3
--- /dev/null
+++ b/benchmark/url/url-parse.js
@@ -0,0 +1,22 @@
+'use strict';
+const common = require('../common.js');
+const url = require('url');
+
+const inputs = {
+ normal: 'http://foo.com/bar',
+ escaped: 'https://foo.bar/{}^`/abcd'
+};
+
+const bench = common.createBenchmark(main, {
+ type: Object.keys(inputs),
+ n: [1e7]
+});
+
+function main({ type, n }) {
+ const input = inputs[type] || '';
+
+ bench.start();
+ for (var i = 0; i < n; i += 1)
+ url.parse(input);
+ bench.end(n);
+}
diff --git a/common.gypi b/common.gypi
index a08e7f487f3b3e..5752c17168d50a 100644
--- a/common.gypi
+++ b/common.gypi
@@ -44,29 +44,29 @@
'conditions': [
['GENERATOR=="ninja"', {
- 'OBJ_DIR': '<(PRODUCT_DIR)/obj',
- 'V8_BASE': '<(PRODUCT_DIR)/obj/deps/v8/src/libv8_base.a',
+ 'obj_dir': '<(PRODUCT_DIR)/obj',
+ 'v8_base': '<(PRODUCT_DIR)/obj/deps/v8/src/libv8_base.a',
}, {
- 'OBJ_DIR%': '<(PRODUCT_DIR)/obj.target',
- 'V8_BASE%': '<(PRODUCT_DIR)/obj.target/deps/v8/src/libv8_base.a',
+ 'obj_dir%': '<(PRODUCT_DIR)/obj.target',
+ 'v8_base%': '<(PRODUCT_DIR)/obj.target/deps/v8/src/libv8_base.a',
}],
['OS == "win"', {
'os_posix': 0,
'v8_postmortem_support%': 'false',
- 'OBJ_DIR': '<(PRODUCT_DIR)/obj',
- 'V8_BASE': '<(PRODUCT_DIR)/lib/v8_libbase.lib',
+ 'obj_dir': '<(PRODUCT_DIR)/obj',
+ 'v8_base': '<(PRODUCT_DIR)/lib/v8_libbase.lib',
}, {
'os_posix': 1,
'v8_postmortem_support%': 'true',
}],
['OS== "mac"', {
- 'OBJ_DIR%': '<(PRODUCT_DIR)/obj.target',
- 'V8_BASE': '<(PRODUCT_DIR)/libv8_base.a',
+ 'obj_dir%': '<(PRODUCT_DIR)/obj.target',
+ 'v8_base': '<(PRODUCT_DIR)/libv8_base.a',
}],
['openssl_fips != ""', {
- 'OPENSSL_PRODUCT': '<(STATIC_LIB_PREFIX)crypto<(STATIC_LIB_SUFFIX)',
+ 'openssl_product': '<(STATIC_LIB_PREFIX)crypto<(STATIC_LIB_SUFFIX)',
}, {
- 'OPENSSL_PRODUCT': '<(STATIC_LIB_PREFIX)openssl<(STATIC_LIB_SUFFIX)',
+ 'openssl_product': '<(STATIC_LIB_PREFIX)openssl<(STATIC_LIB_SUFFIX)',
}],
['OS=="mac"', {
'clang%': 1,
diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS
index c826c8e13306a7..fcb0aac3e83b10 100644
--- a/deps/uv/AUTHORS
+++ b/deps/uv/AUTHORS
@@ -325,3 +325,8 @@ Anna Henningsen
Jérémy Lal
Ben Wijen
elephantp
+Felix Yan
+Mason X
+Jesse Gorzinski
+Ryuichi KAWAMATA
+Joyee Cheung
diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog
index 163500245bf560..509a1d1571d498 100644
--- a/deps/uv/ChangeLog
+++ b/deps/uv/ChangeLog
@@ -1,3 +1,48 @@
+2018.02.22, Version 1.19.2 (Stable), c5afc37e2a8a70d8ab0da8dac10b77ba78c0488c
+
+Changes since version 1.19.1:
+
+* test: fix incorrect asserts (cjihrig)
+
+* test: fix a typo in test-fork.c (Felix Yan)
+
+* build: remove long-obsolete gyp workarounds (Ben Noordhuis)
+
+* build: split off tests into separate gyp file (Ben Noordhuis)
+
+* test: check uv_cond_timedwait more carefully (Jamie Davis)
+
+* include,src: introduce UV__ERR() macro (Mason X)
+
+* build: add url field to libuv.pc (Ben Noordhuis)
+
+* doc: mark IBM i as Tier 3 support (Jesse Gorzinski)
+
+* win,build: correct C2059 errors (Michael Fero)
+
+* zos: fix timeout for condition variable (jBarz)
+
+* win: CREATE_NO_WINDOW when stdio is not inherited (Nick Logan)
+
+* build: fix commmon.gypi comment (Ryuichi KAWAMATA)
+
+* doc: document uv_timer_start() on an active timer (Vladimír Čunát)
+
+* doc: add note about handle movability (Bartosz Sosnowski)
+
+* doc: fix syntax error in loop documentation (Bartosz Sosnowski)
+
+* osx,stream: retry sending handle on EMSGSIZE error (Santiago Gimeno)
+
+* unix: delay fs req register until after validation (cjihrig)
+
+* test: add tests for bad inputs (Joyee Cheung)
+
+* unix,win: ensure req->bufs is freed (cjihrig)
+
+* test: add additional fs memory management checks (cjihrig)
+
+
2018.01.20, Version 1.19.1 (Stable), 8202d1751196c2374ad370f7f3779daef89befae
Changes since version 1.19.0:
diff --git a/deps/uv/SUPPORTED_PLATFORMS.md b/deps/uv/SUPPORTED_PLATFORMS.md
index c56913bbc2fff1..077191086ce524 100644
--- a/deps/uv/SUPPORTED_PLATFORMS.md
+++ b/deps/uv/SUPPORTED_PLATFORMS.md
@@ -11,6 +11,7 @@
| Linux with musl | Tier 2 | musl >= 1.0 | |
| SmartOS | Tier 2 | >= 14.4 | Maintainers: @libuv/smartos |
| Android | Tier 3 | NDK >= r15b | |
+| IBM i | Tier 3 | >= IBM i 7.2 | Maintainers: @libuv/ibmi |
| MinGW | Tier 3 | MinGW32 and MinGW-w64 | |
| SunOS | Tier 3 | Solaris 121 and later | |
| Other | Tier 3 | N/A | |
diff --git a/deps/uv/common.gypi b/deps/uv/common.gypi
index 816847bfc70690..572a1633b0b555 100644
--- a/deps/uv/common.gypi
+++ b/deps/uv/common.gypi
@@ -16,9 +16,9 @@
'VCCLCompilerTool': {
'target_conditions': [
['uv_library=="static_library"', {
- 'RuntimeLibrary': 1, # static debug
+ 'RuntimeLibrary': 1, # /MTd static debug
}, {
- 'RuntimeLibrary': 3, # DLL debug
+ 'RuntimeLibrary': 3, # /MDd DLL debug
}],
],
'Optimization': 0, # /Od, no optimization
@@ -52,9 +52,9 @@
'VCCLCompilerTool': {
'target_conditions': [
['uv_library=="static_library"', {
- 'RuntimeLibrary': 0, # static release
+ 'RuntimeLibrary': 0, # /MT static release
}, {
- 'RuntimeLibrary': 2, # debug release
+ 'RuntimeLibrary': 2, # /MD DLL release
}],
],
'Optimization': 3, # /Ox, full optimization
diff --git a/deps/uv/configure.ac b/deps/uv/configure.ac
index 75fb13c8ce7b23..4074e77841d489 100644
--- a/deps/uv/configure.ac
+++ b/deps/uv/configure.ac
@@ -13,7 +13,7 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
AC_PREREQ(2.57)
-AC_INIT([libuv], [1.19.1], [https://github.com/libuv/libuv/issues])
+AC_INIT([libuv], [1.19.2], [https://github.com/libuv/libuv/issues])
AC_CONFIG_MACRO_DIR([m4])
m4_include([m4/libuv-extra-automake-flags.m4])
m4_include([m4/as_case.m4])
diff --git a/deps/uv/docs/src/handle.rst b/deps/uv/docs/src/handle.rst
index e4cb90b5f7e14b..cdfb76bf8c8928 100644
--- a/deps/uv/docs/src/handle.rst
+++ b/deps/uv/docs/src/handle.rst
@@ -9,6 +9,9 @@
Structures are aligned so that any libuv handle can be cast to `uv_handle_t`.
All API functions defined here work with any handle type.
+Libuv handles are not movable. Pointers to handle structures passed to
+functions must remain valid for the duration of the requested operation. Take
+care when using stack allocated handles.
Data types
----------
diff --git a/deps/uv/docs/src/loop.rst b/deps/uv/docs/src/loop.rst
index dcde5049ac2baa..86a99adf5d669c 100644
--- a/deps/uv/docs/src/loop.rst
+++ b/deps/uv/docs/src/loop.rst
@@ -219,7 +219,7 @@ API
.. caution::
- Any previous value returned from :c:func`uv_backend_fd` is now
+ Any previous value returned from :c:func:`uv_backend_fd` is now
invalid. That function must be called again to determine the
correct backend file descriptor.
diff --git a/deps/uv/docs/src/threading.rst b/deps/uv/docs/src/threading.rst
index bca8ba1d0636f4..89bb4a6f3ae14e 100644
--- a/deps/uv/docs/src/threading.rst
+++ b/deps/uv/docs/src/threading.rst
@@ -131,8 +131,15 @@ Functions return 0 on success or an error code < 0 (unless the
return type is void, of course).
.. note::
- Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait` and
- :c:func:`uv_cond_timedwait`.
+ 1. Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait`
+ and :c:func:`uv_cond_timedwait`.
+ 2. The timeout parameter for :c:func:`uv_cond_timedwait` is relative to the time
+ at which function is called.
+ 3. On z/OS, the timeout parameter for :c:func:`uv_cond_timedwait` is converted to an
+ absolute system time at which the wait expires. If the current system clock time
+ passes the absolute time calculated before the condition is signaled, an ETIMEDOUT
+ error results. After the wait begins, the wait time is not affected by changes
+ to the system clock.
.. c:function:: int uv_cond_init(uv_cond_t* cond)
.. c:function:: void uv_cond_destroy(uv_cond_t* cond)
diff --git a/deps/uv/docs/src/timer.rst b/deps/uv/docs/src/timer.rst
index 8e11f257f8ad16..e163e288fdb275 100644
--- a/deps/uv/docs/src/timer.rst
+++ b/deps/uv/docs/src/timer.rst
@@ -45,6 +45,8 @@ API
.. note::
Does not update the event loop's concept of "now". See :c:func:`uv_update_time` for more information.
+ If the timer is already active, it is simply updated.
+
.. c:function:: int uv_timer_stop(uv_timer_t* handle)
Stop the timer, the callback will not be called anymore.
diff --git a/deps/uv/gyp_uv.py b/deps/uv/gyp_uv.py
index bd37d95c4713f6..c2add5caecc7d3 100755
--- a/deps/uv/gyp_uv.py
+++ b/deps/uv/gyp_uv.py
@@ -43,28 +43,7 @@ def run_gyp(args):
if __name__ == '__main__':
args = sys.argv[1:]
-
- # GYP bug.
- # On msvs it will crash if it gets an absolute path.
- # On Mac/make it will crash if it doesn't get an absolute path.
- if sys.platform == 'win32':
- args.append(os.path.join(uv_root, 'uv.gyp'))
- common_fn = os.path.join(uv_root, 'common.gypi')
- options_fn = os.path.join(uv_root, 'options.gypi')
- # we force vs 2010 over 2008 which would otherwise be the default for gyp
- if not os.environ.get('GYP_MSVS_VERSION'):
- os.environ['GYP_MSVS_VERSION'] = '2010'
- else:
- args.append(os.path.join(os.path.abspath(uv_root), 'uv.gyp'))
- common_fn = os.path.join(os.path.abspath(uv_root), 'common.gypi')
- options_fn = os.path.join(os.path.abspath(uv_root), 'options.gypi')
-
- if os.path.exists(common_fn):
- args.extend(['-I', common_fn])
-
- if os.path.exists(options_fn):
- args.extend(['-I', options_fn])
-
+ args.extend('-I common.gypi test/test.gyp'.split(' '))
args.append('--depth=' + uv_root)
# There's a bug with windows which doesn't allow this feature.
diff --git a/deps/uv/include/uv-errno.h b/deps/uv/include/uv-errno.h
index 8a415331479873..aa4d4509f60dd1 100644
--- a/deps/uv/include/uv-errno.h
+++ b/deps/uv/include/uv-errno.h
@@ -23,6 +23,11 @@
#define UV_ERRNO_H_
#include
+#if EDOM > 0
+# define UV__ERR(x) (-(x))
+#else
+# define UV__ERR(x) (x)
+#endif
#define UV__EOF (-4095)
#define UV__UNKNOWN (-4094)
@@ -46,355 +51,355 @@
* a fairly common practice for Windows programmers to redefine errno codes.
*/
#if defined(E2BIG) && !defined(_WIN32)
-# define UV__E2BIG (-E2BIG)
+# define UV__E2BIG UV__ERR(E2BIG)
#else
# define UV__E2BIG (-4093)
#endif
#if defined(EACCES) && !defined(_WIN32)
-# define UV__EACCES (-EACCES)
+# define UV__EACCES UV__ERR(EACCES)
#else
# define UV__EACCES (-4092)
#endif
#if defined(EADDRINUSE) && !defined(_WIN32)
-# define UV__EADDRINUSE (-EADDRINUSE)
+# define UV__EADDRINUSE UV__ERR(EADDRINUSE)
#else
# define UV__EADDRINUSE (-4091)
#endif
#if defined(EADDRNOTAVAIL) && !defined(_WIN32)
-# define UV__EADDRNOTAVAIL (-EADDRNOTAVAIL)
+# define UV__EADDRNOTAVAIL UV__ERR(EADDRNOTAVAIL)
#else
# define UV__EADDRNOTAVAIL (-4090)
#endif
#if defined(EAFNOSUPPORT) && !defined(_WIN32)
-# define UV__EAFNOSUPPORT (-EAFNOSUPPORT)
+# define UV__EAFNOSUPPORT UV__ERR(EAFNOSUPPORT)
#else
# define UV__EAFNOSUPPORT (-4089)
#endif
#if defined(EAGAIN) && !defined(_WIN32)
-# define UV__EAGAIN (-EAGAIN)
+# define UV__EAGAIN UV__ERR(EAGAIN)
#else
# define UV__EAGAIN (-4088)
#endif
#if defined(EALREADY) && !defined(_WIN32)
-# define UV__EALREADY (-EALREADY)
+# define UV__EALREADY UV__ERR(EALREADY)
#else
# define UV__EALREADY (-4084)
#endif
#if defined(EBADF) && !defined(_WIN32)
-# define UV__EBADF (-EBADF)
+# define UV__EBADF UV__ERR(EBADF)
#else
# define UV__EBADF (-4083)
#endif
#if defined(EBUSY) && !defined(_WIN32)
-# define UV__EBUSY (-EBUSY)
+# define UV__EBUSY UV__ERR(EBUSY)
#else
# define UV__EBUSY (-4082)
#endif
#if defined(ECANCELED) && !defined(_WIN32)
-# define UV__ECANCELED (-ECANCELED)
+# define UV__ECANCELED UV__ERR(ECANCELED)
#else
# define UV__ECANCELED (-4081)
#endif
#if defined(ECHARSET) && !defined(_WIN32)
-# define UV__ECHARSET (-ECHARSET)
+# define UV__ECHARSET UV__ERR(ECHARSET)
#else
# define UV__ECHARSET (-4080)
#endif
#if defined(ECONNABORTED) && !defined(_WIN32)
-# define UV__ECONNABORTED (-ECONNABORTED)
+# define UV__ECONNABORTED UV__ERR(ECONNABORTED)
#else
# define UV__ECONNABORTED (-4079)
#endif
#if defined(ECONNREFUSED) && !defined(_WIN32)
-# define UV__ECONNREFUSED (-ECONNREFUSED)
+# define UV__ECONNREFUSED UV__ERR(ECONNREFUSED)
#else
# define UV__ECONNREFUSED (-4078)
#endif
#if defined(ECONNRESET) && !defined(_WIN32)
-# define UV__ECONNRESET (-ECONNRESET)
+# define UV__ECONNRESET UV__ERR(ECONNRESET)
#else
# define UV__ECONNRESET (-4077)
#endif
#if defined(EDESTADDRREQ) && !defined(_WIN32)
-# define UV__EDESTADDRREQ (-EDESTADDRREQ)
+# define UV__EDESTADDRREQ UV__ERR(EDESTADDRREQ)
#else
# define UV__EDESTADDRREQ (-4076)
#endif
#if defined(EEXIST) && !defined(_WIN32)
-# define UV__EEXIST (-EEXIST)
+# define UV__EEXIST UV__ERR(EEXIST)
#else
# define UV__EEXIST (-4075)
#endif
#if defined(EFAULT) && !defined(_WIN32)
-# define UV__EFAULT (-EFAULT)
+# define UV__EFAULT UV__ERR(EFAULT)
#else
# define UV__EFAULT (-4074)
#endif
#if defined(EHOSTUNREACH) && !defined(_WIN32)
-# define UV__EHOSTUNREACH (-EHOSTUNREACH)
+# define UV__EHOSTUNREACH UV__ERR(EHOSTUNREACH)
#else
# define UV__EHOSTUNREACH (-4073)
#endif
#if defined(EINTR) && !defined(_WIN32)
-# define UV__EINTR (-EINTR)
+# define UV__EINTR UV__ERR(EINTR)
#else
# define UV__EINTR (-4072)
#endif
#if defined(EINVAL) && !defined(_WIN32)
-# define UV__EINVAL (-EINVAL)
+# define UV__EINVAL UV__ERR(EINVAL)
#else
# define UV__EINVAL (-4071)
#endif
#if defined(EIO) && !defined(_WIN32)
-# define UV__EIO (-EIO)
+# define UV__EIO UV__ERR(EIO)
#else
# define UV__EIO (-4070)
#endif
#if defined(EISCONN) && !defined(_WIN32)
-# define UV__EISCONN (-EISCONN)
+# define UV__EISCONN UV__ERR(EISCONN)
#else
# define UV__EISCONN (-4069)
#endif
#if defined(EISDIR) && !defined(_WIN32)
-# define UV__EISDIR (-EISDIR)
+# define UV__EISDIR UV__ERR(EISDIR)
#else
# define UV__EISDIR (-4068)
#endif
#if defined(ELOOP) && !defined(_WIN32)
-# define UV__ELOOP (-ELOOP)
+# define UV__ELOOP UV__ERR(ELOOP)
#else
# define UV__ELOOP (-4067)
#endif
#if defined(EMFILE) && !defined(_WIN32)
-# define UV__EMFILE (-EMFILE)
+# define UV__EMFILE UV__ERR(EMFILE)
#else
# define UV__EMFILE (-4066)
#endif
#if defined(EMSGSIZE) && !defined(_WIN32)
-# define UV__EMSGSIZE (-EMSGSIZE)
+# define UV__EMSGSIZE UV__ERR(EMSGSIZE)
#else
# define UV__EMSGSIZE (-4065)
#endif
#if defined(ENAMETOOLONG) && !defined(_WIN32)
-# define UV__ENAMETOOLONG (-ENAMETOOLONG)
+# define UV__ENAMETOOLONG UV__ERR(ENAMETOOLONG)
#else
# define UV__ENAMETOOLONG (-4064)
#endif
#if defined(ENETDOWN) && !defined(_WIN32)
-# define UV__ENETDOWN (-ENETDOWN)
+# define UV__ENETDOWN UV__ERR(ENETDOWN)
#else
# define UV__ENETDOWN (-4063)
#endif
#if defined(ENETUNREACH) && !defined(_WIN32)
-# define UV__ENETUNREACH (-ENETUNREACH)
+# define UV__ENETUNREACH UV__ERR(ENETUNREACH)
#else
# define UV__ENETUNREACH (-4062)
#endif
#if defined(ENFILE) && !defined(_WIN32)
-# define UV__ENFILE (-ENFILE)
+# define UV__ENFILE UV__ERR(ENFILE)
#else
# define UV__ENFILE (-4061)
#endif
#if defined(ENOBUFS) && !defined(_WIN32)
-# define UV__ENOBUFS (-ENOBUFS)
+# define UV__ENOBUFS UV__ERR(ENOBUFS)
#else
# define UV__ENOBUFS (-4060)
#endif
#if defined(ENODEV) && !defined(_WIN32)
-# define UV__ENODEV (-ENODEV)
+# define UV__ENODEV UV__ERR(ENODEV)
#else
# define UV__ENODEV (-4059)
#endif
#if defined(ENOENT) && !defined(_WIN32)
-# define UV__ENOENT (-ENOENT)
+# define UV__ENOENT UV__ERR(ENOENT)
#else
# define UV__ENOENT (-4058)
#endif
#if defined(ENOMEM) && !defined(_WIN32)
-# define UV__ENOMEM (-ENOMEM)
+# define UV__ENOMEM UV__ERR(ENOMEM)
#else
# define UV__ENOMEM (-4057)
#endif
#if defined(ENONET) && !defined(_WIN32)
-# define UV__ENONET (-ENONET)
+# define UV__ENONET UV__ERR(ENONET)
#else
# define UV__ENONET (-4056)
#endif
#if defined(ENOSPC) && !defined(_WIN32)
-# define UV__ENOSPC (-ENOSPC)
+# define UV__ENOSPC UV__ERR(ENOSPC)
#else
# define UV__ENOSPC (-4055)
#endif
#if defined(ENOSYS) && !defined(_WIN32)
-# define UV__ENOSYS (-ENOSYS)
+# define UV__ENOSYS UV__ERR(ENOSYS)
#else
# define UV__ENOSYS (-4054)
#endif
#if defined(ENOTCONN) && !defined(_WIN32)
-# define UV__ENOTCONN (-ENOTCONN)
+# define UV__ENOTCONN UV__ERR(ENOTCONN)
#else
# define UV__ENOTCONN (-4053)
#endif
#if defined(ENOTDIR) && !defined(_WIN32)
-# define UV__ENOTDIR (-ENOTDIR)
+# define UV__ENOTDIR UV__ERR(ENOTDIR)
#else
# define UV__ENOTDIR (-4052)
#endif
#if defined(ENOTEMPTY) && !defined(_WIN32)
-# define UV__ENOTEMPTY (-ENOTEMPTY)
+# define UV__ENOTEMPTY UV__ERR(ENOTEMPTY)
#else
# define UV__ENOTEMPTY (-4051)
#endif
#if defined(ENOTSOCK) && !defined(_WIN32)
-# define UV__ENOTSOCK (-ENOTSOCK)
+# define UV__ENOTSOCK UV__ERR(ENOTSOCK)
#else
# define UV__ENOTSOCK (-4050)
#endif
#if defined(ENOTSUP) && !defined(_WIN32)
-# define UV__ENOTSUP (-ENOTSUP)
+# define UV__ENOTSUP UV__ERR(ENOTSUP)
#else
# define UV__ENOTSUP (-4049)
#endif
#if defined(EPERM) && !defined(_WIN32)
-# define UV__EPERM (-EPERM)
+# define UV__EPERM UV__ERR(EPERM)
#else
# define UV__EPERM (-4048)
#endif
#if defined(EPIPE) && !defined(_WIN32)
-# define UV__EPIPE (-EPIPE)
+# define UV__EPIPE UV__ERR(EPIPE)
#else
# define UV__EPIPE (-4047)
#endif
#if defined(EPROTO) && !defined(_WIN32)
-# define UV__EPROTO (-EPROTO)
+# define UV__EPROTO UV__ERR(EPROTO)
#else
-# define UV__EPROTO (-4046)
+# define UV__EPROTO UV__ERR(4046)
#endif
#if defined(EPROTONOSUPPORT) && !defined(_WIN32)
-# define UV__EPROTONOSUPPORT (-EPROTONOSUPPORT)
+# define UV__EPROTONOSUPPORT UV__ERR(EPROTONOSUPPORT)
#else
# define UV__EPROTONOSUPPORT (-4045)
#endif
#if defined(EPROTOTYPE) && !defined(_WIN32)
-# define UV__EPROTOTYPE (-EPROTOTYPE)
+# define UV__EPROTOTYPE UV__ERR(EPROTOTYPE)
#else
# define UV__EPROTOTYPE (-4044)
#endif
#if defined(EROFS) && !defined(_WIN32)
-# define UV__EROFS (-EROFS)
+# define UV__EROFS UV__ERR(EROFS)
#else
# define UV__EROFS (-4043)
#endif
#if defined(ESHUTDOWN) && !defined(_WIN32)
-# define UV__ESHUTDOWN (-ESHUTDOWN)
+# define UV__ESHUTDOWN UV__ERR(ESHUTDOWN)
#else
# define UV__ESHUTDOWN (-4042)
#endif
#if defined(ESPIPE) && !defined(_WIN32)
-# define UV__ESPIPE (-ESPIPE)
+# define UV__ESPIPE UV__ERR(ESPIPE)
#else
# define UV__ESPIPE (-4041)
#endif
#if defined(ESRCH) && !defined(_WIN32)
-# define UV__ESRCH (-ESRCH)
+# define UV__ESRCH UV__ERR(ESRCH)
#else
# define UV__ESRCH (-4040)
#endif
#if defined(ETIMEDOUT) && !defined(_WIN32)
-# define UV__ETIMEDOUT (-ETIMEDOUT)
+# define UV__ETIMEDOUT UV__ERR(ETIMEDOUT)
#else
# define UV__ETIMEDOUT (-4039)
#endif
#if defined(ETXTBSY) && !defined(_WIN32)
-# define UV__ETXTBSY (-ETXTBSY)
+# define UV__ETXTBSY UV__ERR(ETXTBSY)
#else
# define UV__ETXTBSY (-4038)
#endif
#if defined(EXDEV) && !defined(_WIN32)
-# define UV__EXDEV (-EXDEV)
+# define UV__EXDEV UV__ERR(EXDEV)
#else
# define UV__EXDEV (-4037)
#endif
#if defined(EFBIG) && !defined(_WIN32)
-# define UV__EFBIG (-EFBIG)
+# define UV__EFBIG UV__ERR(EFBIG)
#else
# define UV__EFBIG (-4036)
#endif
#if defined(ENOPROTOOPT) && !defined(_WIN32)
-# define UV__ENOPROTOOPT (-ENOPROTOOPT)
+# define UV__ENOPROTOOPT UV__ERR(ENOPROTOOPT)
#else
# define UV__ENOPROTOOPT (-4035)
#endif
#if defined(ERANGE) && !defined(_WIN32)
-# define UV__ERANGE (-ERANGE)
+# define UV__ERANGE UV__ERR(ERANGE)
#else
# define UV__ERANGE (-4034)
#endif
#if defined(ENXIO) && !defined(_WIN32)
-# define UV__ENXIO (-ENXIO)
+# define UV__ENXIO UV__ERR(ENXIO)
#else
# define UV__ENXIO (-4033)
#endif
#if defined(EMLINK) && !defined(_WIN32)
-# define UV__EMLINK (-EMLINK)
+# define UV__EMLINK UV__ERR(EMLINK)
#else
# define UV__EMLINK (-4032)
#endif
@@ -404,7 +409,7 @@
* icky to hard-code it.
*/
#if defined(EHOSTDOWN) && !defined(_WIN32)
-# define UV__EHOSTDOWN (-EHOSTDOWN)
+# define UV__EHOSTDOWN UV__ERR(EHOSTDOWN)
#elif defined(__APPLE__) || \
defined(__DragonFly__) || \
defined(__FreeBSD__) || \
@@ -417,15 +422,16 @@
#endif
#if defined(EREMOTEIO) && !defined(_WIN32)
-# define UV__EREMOTEIO (-EREMOTEIO)
+# define UV__EREMOTEIO UV__ERR(EREMOTEIO)
#else
# define UV__EREMOTEIO (-4030)
#endif
#if defined(ENOTTY) && !defined(_WIN32)
-# define UV__ENOTTY (-ENOTTY)
+# define UV__ENOTTY UV__ERR(ENOTTY)
#else
# define UV__ENOTTY (-4029)
#endif
+
#endif /* UV_ERRNO_H_ */
diff --git a/deps/uv/include/uv-version.h b/deps/uv/include/uv-version.h
index 581d761df98139..c2753d51c7c36e 100644
--- a/deps/uv/include/uv-version.h
+++ b/deps/uv/include/uv-version.h
@@ -32,7 +32,7 @@
#define UV_VERSION_MAJOR 1
#define UV_VERSION_MINOR 19
-#define UV_VERSION_PATCH 1
+#define UV_VERSION_PATCH 2
#define UV_VERSION_IS_RELEASE 1
#define UV_VERSION_SUFFIX ""
diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h
index 3a061132cce528..9794d9969b620e 100644
--- a/deps/uv/include/uv.h
+++ b/deps/uv/include/uv.h
@@ -1559,6 +1559,7 @@ UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data);
#undef UV_SIGNAL_PRIVATE_FIELDS
#undef UV_LOOP_PRIVATE_FIELDS
#undef UV_LOOP_PRIVATE_PLATFORM_FIELDS
+#undef UV__ERR
#ifdef __cplusplus
}
diff --git a/deps/uv/libuv.pc.in b/deps/uv/libuv.pc.in
index 9174fe151d7421..55c4b65d5dc5cf 100644
--- a/deps/uv/libuv.pc.in
+++ b/deps/uv/libuv.pc.in
@@ -6,6 +6,7 @@ includedir=@includedir@
Name: @PACKAGE_NAME@
Version: @PACKAGE_VERSION@
Description: multi-platform support library with a focus on asynchronous I/O.
+URL: http://libuv.org/
Libs: -L${libdir} -luv @LIBS@
Cflags: -I${includedir}
diff --git a/deps/uv/src/unix/aix-common.c b/deps/uv/src/unix/aix-common.c
index 2cfe8be6f11830..e17e449481836a 100644
--- a/deps/uv/src/unix/aix-common.c
+++ b/deps/uv/src/unix/aix-common.c
@@ -83,12 +83,12 @@ int uv_exepath(char* buffer, size_t* size) {
struct procsinfo pi;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
pi.pi_pid = getpid();
res = getargs(&pi, sizeof(pi), args, sizeof(args));
if (res < 0)
- return -EINVAL;
+ return UV_EINVAL;
/*
* Possibilities for args:
@@ -101,7 +101,7 @@ int uv_exepath(char* buffer, size_t* size) {
/* Case i) and ii) absolute or relative paths */
if (strchr(args, '/') != NULL) {
if (realpath(args, abspath) != abspath)
- return -errno;
+ return UV__ERR(errno);
abspath_size = strlen(abspath);
@@ -121,11 +121,11 @@ int uv_exepath(char* buffer, size_t* size) {
char *path = getenv("PATH");
if (path == NULL)
- return -EINVAL;
+ return UV_EINVAL;
clonedpath = uv__strdup(path);
if (clonedpath == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
token = strtok(clonedpath, ":");
while (token != NULL) {
@@ -151,7 +151,7 @@ int uv_exepath(char* buffer, size_t* size) {
uv__free(clonedpath);
/* Out of tokens (path entries), and no match found */
- return -EINVAL;
+ return UV_EINVAL;
}
}
@@ -177,19 +177,19 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
*count = 0;
if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
- return -errno;
+ return UV__ERR(errno);
}
if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
ifc.ifc_req = (struct ifreq*)uv__malloc(size);
ifc.ifc_len = size;
if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
#define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p))
@@ -208,7 +208,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
@@ -221,7 +221,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
*addresses = uv__malloc(*count * sizeof(uv_interface_address_t));
if (!(*addresses)) {
uv__close(sockfd);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
@@ -240,7 +240,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
uv__close(sockfd);
- return -ENOSYS;
+ return UV_ENOSYS;
}
if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
@@ -260,7 +260,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
if (ioctl(sockfd, SIOCGIFNETMASK, p) == -1) {
uv__close(sockfd);
- return -ENOSYS;
+ return UV_ENOSYS;
}
if (inet6)
diff --git a/deps/uv/src/unix/aix.c b/deps/uv/src/unix/aix.c
index fd413090feddf0..92de8148341e10 100644
--- a/deps/uv/src/unix/aix.c
+++ b/deps/uv/src/unix/aix.c
@@ -119,7 +119,7 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
pc.fd = fd;
if (pollset_ctl(loop->backend_fd, &pc, 1))
- return -errno;
+ return UV__ERR(errno);
pc.cmd = PS_DELETE;
if (pollset_ctl(loop->backend_fd, &pc, 1))
@@ -409,22 +409,22 @@ static int uv__is_ahafs_mounted(void){
p = uv__malloc(siz);
if (p == NULL)
- return -errno;
+ return UV__ERR(errno);
/* Retrieve all mounted filesystems */
rv = mntctl(MCTL_QUERY, siz, (char*)p);
if (rv < 0)
- return -errno;
+ return UV__ERR(errno);
if (rv == 0) {
/* buffer was not large enough, reallocate to correct size */
siz = *(int*)p;
uv__free(p);
p = uv__malloc(siz);
if (p == NULL)
- return -errno;
+ return UV__ERR(errno);
rv = mntctl(MCTL_QUERY, siz, (char*)p);
if (rv < 0)
- return -errno;
+ return UV__ERR(errno);
}
/* Look for dev in filesystems mount info */
@@ -495,7 +495,7 @@ static int uv__make_subdirs_p(const char *filename) {
rc = uv__makedir_p(cmd);
if (rc == -1 && errno != EEXIST){
- return -errno;
+ return UV__ERR(errno);
}
return rc;
@@ -522,7 +522,7 @@ static int uv__setup_ahafs(const char* filename, int *fd) {
sprintf(mon_file, "/aha/fs/modFile.monFactory");
if ((strlen(mon_file) + strlen(filename) + 5) > PATH_MAX)
- return -ENAMETOOLONG;
+ return UV_ENAMETOOLONG;
/* Make the necessary subdirectories for the monitor file */
rc = uv__make_subdirs_p(filename);
@@ -537,7 +537,7 @@ static int uv__setup_ahafs(const char* filename, int *fd) {
/* Open the monitor file, creating it if necessary */
*fd = open(mon_file, O_CREAT|O_RDWR);
if (*fd < 0)
- return -errno;
+ return UV__ERR(errno);
/* Write out the monitoring specifications.
* In this case, we are monitoring for a state change event type
@@ -558,7 +558,7 @@ static int uv__setup_ahafs(const char* filename, int *fd) {
rc = write(*fd, mon_file_write_string, strlen(mon_file_write_string)+1);
if (rc < 0)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -716,7 +716,7 @@ int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT);
return 0;
#else
- return -ENOSYS;
+ return UV_ENOSYS;
#endif
}
@@ -771,7 +771,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
return 0;
#else
- return -ENOSYS;
+ return UV_ENOSYS;
#endif
}
@@ -796,7 +796,7 @@ int uv_fs_event_stop(uv_fs_event_t* handle) {
return 0;
#else
- return -ENOSYS;
+ return UV_ENOSYS;
#endif
}
@@ -861,7 +861,7 @@ int uv_set_process_title(const char* title) {
*/
new_title = uv__strdup(title);
if (new_title == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
@@ -888,9 +888,9 @@ int uv_get_process_title(char* buffer, size_t size) {
size_t len;
len = strlen(process_argv[0]);
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
else if (size <= len)
- return -ENOBUFS;
+ return UV_ENOBUFS;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
@@ -919,10 +919,10 @@ int uv_resident_set_memory(size_t* rss) {
fd = open(pp, O_RDONLY);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
/* FIXME(bnoordhuis) Handle EINTR. */
- err = -EINVAL;
+ err = UV_EINVAL;
if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) {
*rss = (size_t)psinfo.pr_rssize * 1024;
err = 0;
@@ -953,7 +953,7 @@ int uv_uptime(double* uptime) {
endutent();
if (boot_time == 0)
- return -ENOSYS;
+ return UV_ENOSYS;
*uptime = time(NULL) - boot_time;
return 0;
@@ -969,30 +969,30 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1);
if (result == -1) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
ncpus = result = perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0);
if (result == -1) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
ps_cpus = (perfstat_cpu_t*) uv__malloc(ncpus * sizeof(perfstat_cpu_t));
if (!ps_cpus) {
- return -ENOMEM;
+ return UV_ENOMEM;
}
strcpy(cpu_id.name, FIRST_CPU);
result = perfstat_cpu(&cpu_id, ps_cpus, sizeof(perfstat_cpu_t), ncpus);
if (result == -1) {
uv__free(ps_cpus);
- return -ENOSYS;
+ return UV_ENOSYS;
}
*cpu_infos = (uv_cpu_info_t*) uv__malloc(ncpus * sizeof(uv_cpu_info_t));
if (!*cpu_infos) {
uv__free(ps_cpus);
- return -ENOMEM;
+ return UV_ENOMEM;
}
*count = ncpus;
diff --git a/deps/uv/src/unix/async.c b/deps/uv/src/unix/async.c
index 45c088ea1b39bc..0b450ae0da7f37 100644
--- a/deps/uv/src/unix/async.c
+++ b/deps/uv/src/unix/async.c
@@ -166,7 +166,7 @@ static int uv__async_start(uv_loop_t* loop) {
pipefd[0] = err;
pipefd[1] = -1;
}
- else if (err == -ENOSYS) {
+ else if (err == UV_ENOSYS) {
err = uv__make_pipe(pipefd, UV__F_NONBLOCK);
#if defined(__linux__)
/* Save a file descriptor by opening one of the pipe descriptors as
@@ -240,7 +240,7 @@ static int uv__async_eventfd(void) {
return fd;
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
no_eventfd2 = 1;
@@ -257,7 +257,7 @@ static int uv__async_eventfd(void) {
}
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
no_eventfd = 1;
@@ -265,5 +265,5 @@ static int uv__async_eventfd(void) {
#endif
- return -ENOSYS;
+ return UV_ENOSYS;
}
diff --git a/deps/uv/src/unix/bsd-ifaddrs.c b/deps/uv/src/unix/bsd-ifaddrs.c
index ea3166c5e977c7..0d0215448640a4 100644
--- a/deps/uv/src/unix/bsd-ifaddrs.c
+++ b/deps/uv/src/unix/bsd-ifaddrs.c
@@ -70,7 +70,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
int i;
if (getifaddrs(&addrs) != 0)
- return -errno;
+ return UV__ERR(errno);
*count = 0;
@@ -85,7 +85,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
if (*addresses == NULL) {
freeifaddrs(addrs);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c
index c7e431e5295d1b..3741c1d06b2d79 100644
--- a/deps/uv/src/unix/core.c
+++ b/deps/uv/src/unix/core.c
@@ -191,14 +191,14 @@ int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) {
socklen_t len;
if (handle == NULL || value == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (handle->type == UV_TCP || handle->type == UV_NAMED_PIPE)
fd = uv__stream_fd((uv_stream_t*) handle);
else if (handle->type == UV_UDP)
fd = ((uv_udp_t *) handle)->io_watcher.fd;
else
- return -ENOTSUP;
+ return UV_ENOTSUP;
len = sizeof(*value);
@@ -208,7 +208,7 @@ int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) {
r = setsockopt(fd, SOL_SOCKET, optname, (const void*) value, len);
if (r < 0)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -418,12 +418,12 @@ int uv__socket(int domain, int type, int protocol) {
return sockfd;
if (errno != EINVAL)
- return -errno;
+ return UV__ERR(errno);
#endif
sockfd = socket(domain, type, protocol);
if (sockfd == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__nonblock(sockfd, 1);
if (err == 0)
@@ -487,7 +487,7 @@ int uv__accept(int sockfd) {
continue;
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
no_accept4 = 1;
skip:
@@ -497,7 +497,7 @@ int uv__accept(int sockfd) {
if (peerfd == -1) {
if (errno == EINTR)
continue;
- return -errno;
+ return UV__ERR(errno);
}
err = uv__cloexec(peerfd, 1);
@@ -523,8 +523,8 @@ int uv__close_nocheckstdio(int fd) {
saved_errno = errno;
rc = close(fd);
if (rc == -1) {
- rc = -errno;
- if (rc == -EINTR || rc == -EINPROGRESS)
+ rc = UV__ERR(errno);
+ if (rc == UV_EINTR || rc == UV__ERR(EINPROGRESS))
rc = 0; /* The close is in progress, not an error. */
errno = saved_errno;
}
@@ -550,7 +550,7 @@ int uv__nonblock_ioctl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -565,7 +565,7 @@ int uv__cloexec_ioctl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -581,7 +581,7 @@ int uv__nonblock_fcntl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r == -1)
- return -errno;
+ return UV__ERR(errno);
/* Bail out now if already set/clear. */
if (!!(r & O_NONBLOCK) == !!set)
@@ -597,7 +597,7 @@ int uv__nonblock_fcntl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -612,7 +612,7 @@ int uv__cloexec_fcntl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r == -1)
- return -errno;
+ return UV__ERR(errno);
/* Bail out now if already set/clear. */
if (!!(r & FD_CLOEXEC) == !!set)
@@ -628,7 +628,7 @@ int uv__cloexec_fcntl(int fd, int set) {
while (r == -1 && errno == EINTR);
if (r)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -643,7 +643,7 @@ int uv__dup(int fd) {
fd = dup(fd);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__cloexec(fd, 1);
if (err) {
@@ -667,10 +667,10 @@ ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) {
if (rc != -1)
return rc;
if (errno != EINVAL)
- return -errno;
+ return UV__ERR(errno);
rc = recvmsg(fd, msg, flags);
if (rc == -1)
- return -errno;
+ return UV__ERR(errno);
no_msg_cmsg_cloexec = 1;
} else {
rc = recvmsg(fd, msg, flags);
@@ -679,7 +679,7 @@ ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) {
rc = recvmsg(fd, msg, flags);
#endif
if (rc == -1)
- return -errno;
+ return UV__ERR(errno);
if (msg->msg_controllen == 0)
return rc;
for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg))
@@ -695,10 +695,10 @@ ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) {
int uv_cwd(char* buffer, size_t* size) {
if (buffer == NULL || size == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (getcwd(buffer, *size) == NULL)
- return -errno;
+ return UV__ERR(errno);
*size = strlen(buffer);
if (*size > 1 && buffer[*size - 1] == '/') {
@@ -712,7 +712,7 @@ int uv_cwd(char* buffer, size_t* size) {
int uv_chdir(const char* dir) {
if (chdir(dir))
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -749,11 +749,11 @@ int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) {
break;
default:
- return -EINVAL;
+ return UV_EINVAL;
}
if (uv__is_closing(handle) || fd_out == -1)
- return -EBADF;
+ return UV_EBADF;
*fd = fd_out;
return 0;
@@ -931,7 +931,7 @@ int uv_getrusage(uv_rusage_t* rusage) {
struct rusage usage;
if (getrusage(RUSAGE_SELF, &usage))
- return -errno;
+ return UV__ERR(errno);
rusage->ru_utime.tv_sec = usage.ru_utime.tv_sec;
rusage->ru_utime.tv_usec = usage.ru_utime.tv_usec;
@@ -973,7 +973,7 @@ int uv__open_cloexec(const char* path, int flags) {
return fd;
if (errno != EINVAL)
- return -errno;
+ return UV__ERR(errno);
/* O_CLOEXEC not supported. */
no_cloexec = 1;
@@ -982,7 +982,7 @@ int uv__open_cloexec(const char* path, int flags) {
fd = open(path, flags);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__cloexec(fd, 1);
if (err) {
@@ -999,14 +999,14 @@ int uv__dup2_cloexec(int oldfd, int newfd) {
#if (defined(__FreeBSD__) && __FreeBSD__ >= 10) || defined(__NetBSD__)
r = dup3(oldfd, newfd, O_CLOEXEC);
if (r == -1)
- return -errno;
+ return UV__ERR(errno);
return r;
#elif defined(__FreeBSD__) && defined(F_DUP2FD_CLOEXEC)
r = fcntl(oldfd, F_DUP2FD_CLOEXEC, newfd);
if (r != -1)
return r;
if (errno != EINVAL)
- return -errno;
+ return UV__ERR(errno);
/* Fall through. */
#elif defined(__linux__)
static int no_dup3;
@@ -1017,7 +1017,7 @@ int uv__dup2_cloexec(int oldfd, int newfd) {
if (r != -1)
return r;
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
/* Fall through. */
no_dup3 = 1;
}
@@ -1033,7 +1033,7 @@ int uv__dup2_cloexec(int oldfd, int newfd) {
#endif
if (r == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__cloexec(newfd, 1);
if (err) {
@@ -1053,7 +1053,7 @@ int uv_os_homedir(char* buffer, size_t* size) {
int r;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
/* Check if the HOME environment variable is set first */
buf = getenv("HOME");
@@ -1063,7 +1063,7 @@ int uv_os_homedir(char* buffer, size_t* size) {
if (len >= *size) {
*size = len + 1;
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, buf, len + 1);
@@ -1084,7 +1084,7 @@ int uv_os_homedir(char* buffer, size_t* size) {
if (len >= *size) {
*size = len + 1;
uv_os_free_passwd(&pwd);
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, pwd.homedir, len + 1);
@@ -1100,7 +1100,7 @@ int uv_os_tmpdir(char* buffer, size_t* size) {
size_t len;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
#define CHECK_ENV_VAR(name) \
do { \
@@ -1130,7 +1130,7 @@ int uv_os_tmpdir(char* buffer, size_t* size) {
if (len >= *size) {
*size = len + 1;
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
/* The returned directory should not have a trailing slash. */
@@ -1162,11 +1162,11 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
getpwuid_r = dlsym(RTLD_DEFAULT, "getpwuid_r");
if (getpwuid_r == NULL)
- return -ENOSYS;
+ return UV_ENOSYS;
#endif
if (pwd == NULL)
- return -EINVAL;
+ return UV_EINVAL;
initsize = sysconf(_SC_GETPW_R_SIZE_MAX);
@@ -1183,7 +1183,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
buf = uv__malloc(bufsize);
if (buf == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
r = getpwuid_r(uid, &pw, buf, bufsize, &result);
@@ -1200,7 +1200,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
if (result == NULL) {
uv__free(buf);
- return -ENOENT;
+ return UV_ENOENT;
}
/* Allocate memory for the username, shell, and home directory */
@@ -1211,7 +1211,7 @@ int uv__getpwuid_r(uv_passwd_t* pwd) {
if (pwd->username == NULL) {
uv__free(buf);
- return -ENOMEM;
+ return UV_ENOMEM;
}
/* Copy the username */
@@ -1267,18 +1267,18 @@ int uv_os_getenv(const char* name, char* buffer, size_t* size) {
size_t len;
if (name == NULL || buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
var = getenv(name);
if (var == NULL)
- return -ENOENT;
+ return UV_ENOENT;
len = strlen(var);
if (len >= *size) {
*size = len + 1;
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, var, len + 1);
@@ -1290,10 +1290,10 @@ int uv_os_getenv(const char* name, char* buffer, size_t* size) {
int uv_os_setenv(const char* name, const char* value) {
if (name == NULL || value == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (setenv(name, value, 1) != 0)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -1301,10 +1301,10 @@ int uv_os_setenv(const char* name, const char* value) {
int uv_os_unsetenv(const char* name) {
if (name == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (unsetenv(name) != 0)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -1321,17 +1321,17 @@ int uv_os_gethostname(char* buffer, size_t* size) {
size_t len;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
if (gethostname(buf, sizeof(buf)) != 0)
- return -errno;
+ return UV__ERR(errno);
buf[sizeof(buf) - 1] = '\0'; /* Null terminate, just to be safe. */
len = strlen(buf);
if (len >= *size) {
*size = len + 1;
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, buf, len + 1);
diff --git a/deps/uv/src/unix/cygwin.c b/deps/uv/src/unix/cygwin.c
index 5a887dd4c2d03e..9fe4093ef46fb0 100644
--- a/deps/uv/src/unix/cygwin.c
+++ b/deps/uv/src/unix/cygwin.c
@@ -29,7 +29,7 @@ int uv_uptime(double* uptime) {
struct sysinfo info;
if (sysinfo(&info) < 0)
- return -errno;
+ return UV__ERR(errno);
*uptime = info.uptime;
return 0;
diff --git a/deps/uv/src/unix/darwin-proctitle.c b/deps/uv/src/unix/darwin-proctitle.c
index 1142311609fb07..dabde2239ccab3 100644
--- a/deps/uv/src/unix/darwin-proctitle.c
+++ b/deps/uv/src/unix/darwin-proctitle.c
@@ -18,6 +18,9 @@
* IN THE SOFTWARE.
*/
+#include "uv.h"
+#include "internal.h"
+
#include
#include
#include
@@ -41,14 +44,14 @@ static int uv__pthread_setname_np(const char* name) {
dlsym(RTLD_DEFAULT, "pthread_setname_np");
if (dynamic_pthread_setname_np == NULL)
- return -ENOSYS;
+ return UV_ENOSYS;
strncpy(namebuf, name, sizeof(namebuf) - 1);
namebuf[sizeof(namebuf) - 1] = '\0';
err = dynamic_pthread_setname_np(namebuf);
if (err)
- return -err;
+ return UV__ERR(err);
return 0;
}
@@ -84,7 +87,7 @@ int uv__set_process_title(const char* title) {
CFTypeRef asn;
int err;
- err = -ENOENT;
+ err = UV_ENOENT;
application_services_handle = dlopen("/System/Library/Frameworks/"
"ApplicationServices.framework/"
"Versions/A/ApplicationServices",
@@ -151,7 +154,7 @@ int uv__set_process_title(const char* title) {
/* Black 10.9 magic, to remove (Not responding) mark in Activity Monitor */
hi_services_bundle =
pCFBundleGetBundleWithIdentifier(S("com.apple.HIServices"));
- err = -ENOENT;
+ err = UV_ENOENT;
if (hi_services_bundle == NULL)
goto out;
@@ -182,7 +185,7 @@ int uv__set_process_title(const char* title) {
asn = pLSGetCurrentApplicationASN();
- err = -EINVAL;
+ err = UV_EINVAL;
if (pLSSetApplicationInformationItem(-2, /* Magic value. */
asn,
*display_name_key,
diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c
index df6dd1c61bbc24..31ad8a9e48a077 100644
--- a/deps/uv/src/unix/darwin.c
+++ b/deps/uv/src/unix/darwin.c
@@ -37,7 +37,7 @@ int uv__platform_loop_init(uv_loop_t* loop) {
loop->cf_state = NULL;
if (uv__kqueue_init(loop))
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -68,18 +68,18 @@ int uv_exepath(char* buffer, size_t* size) {
size_t abspath_size;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
exepath_size = sizeof(exepath);
if (_NSGetExecutablePath(exepath, &exepath_size))
- return -EIO;
+ return UV_EIO;
if (realpath(exepath, abspath) != abspath)
- return -errno;
+ return UV__ERR(errno);
abspath_size = strlen(abspath);
if (abspath_size == 0)
- return -EIO;
+ return UV_EIO;
*size -= 1;
if (*size > abspath_size)
@@ -98,7 +98,7 @@ uint64_t uv_get_free_memory(void) {
if (host_statistics(mach_host_self(), HOST_VM_INFO,
(host_info_t)&info, &count) != KERN_SUCCESS) {
- return -EINVAL; /* FIXME(bnoordhuis) Translate error. */
+ return UV_EINVAL; /* FIXME(bnoordhuis) Translate error. */
}
return (uint64_t) info.free_count * sysconf(_SC_PAGESIZE);
@@ -111,7 +111,7 @@ uint64_t uv_get_total_memory(void) {
size_t size = sizeof(info);
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info;
}
@@ -158,7 +158,7 @@ int uv_uptime(double* uptime) {
static int which[] = {CTL_KERN, KERN_BOOTTIME};
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
now = time(NULL);
*uptime = now - info.tv_sec;
@@ -181,23 +181,23 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(model);
if (sysctlbyname("machdep.cpu.brand_string", &model, &size, NULL, 0) &&
sysctlbyname("hw.model", &model, &size, NULL, 0)) {
- return -errno;
+ return UV__ERR(errno);
}
size = sizeof(cpuspeed);
if (sysctlbyname("hw.cpufrequency", &cpuspeed, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
if (host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numcpus,
(processor_info_array_t*)&info,
&msg_type) != KERN_SUCCESS) {
- return -EINVAL; /* FIXME(bnoordhuis) Translate error. */
+ return UV_EINVAL; /* FIXME(bnoordhuis) Translate error. */
}
*cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos));
if (!(*cpu_infos)) {
vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type);
- return -ENOMEM;
+ return UV_ENOMEM;
}
*count = numcpus;
diff --git a/deps/uv/src/unix/freebsd.c b/deps/uv/src/unix/freebsd.c
index f2b3f247a05e3a..70ccb13042fddb 100644
--- a/deps/uv/src/unix/freebsd.c
+++ b/deps/uv/src/unix/freebsd.c
@@ -72,11 +72,11 @@ int uv_exepath(char* buffer, size_t* size) {
ssize_t abspath_size;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
abspath_size = readlink("/proc/curproc/file", abspath, sizeof(abspath));
if (abspath_size < 0)
- return -errno;
+ return UV__ERR(errno);
assert(abspath_size > 0);
*size -= 1;
@@ -96,7 +96,7 @@ int uv_exepath(char* buffer, size_t* size) {
size_t abspath_size;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
@@ -105,7 +105,7 @@ int uv_exepath(char* buffer, size_t* size) {
abspath_size = sizeof abspath;
if (sysctl(mib, 4, abspath, &abspath_size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
assert(abspath_size > 0);
abspath_size -= 1;
@@ -126,7 +126,7 @@ uint64_t uv_get_free_memory(void) {
size_t size = sizeof(freecount);
if (sysctlbyname("vm.stats.vm.v_free_count", &freecount, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) freecount * sysconf(_SC_PAGESIZE);
@@ -140,7 +140,7 @@ uint64_t uv_get_total_memory(void) {
size_t size = sizeof(info);
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info;
}
@@ -176,7 +176,7 @@ int uv_set_process_title(const char* title) {
if (process_title == NULL) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOMEM;
+ return UV_ENOMEM;
}
uv__free(process_title);
@@ -204,7 +204,7 @@ int uv_get_process_title(char* buffer, size_t size) {
size_t len;
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
@@ -214,7 +214,7 @@ int uv_get_process_title(char* buffer, size_t size) {
if (size < len) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, process_title, len);
@@ -243,7 +243,7 @@ int uv_resident_set_memory(size_t* rss) {
kinfo_size = sizeof(kinfo);
if (sysctl(mib, 4, &kinfo, &kinfo_size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
page_size = getpagesize();
@@ -262,7 +262,7 @@ int uv_uptime(double* uptime) {
struct timespec sp;
r = clock_gettime(CLOCK_MONOTONIC, &sp);
if (r)
- return -errno;
+ return UV__ERR(errno);
*uptime = sp.tv_sec;
return 0;
@@ -309,15 +309,15 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(model);
if (sysctlbyname(model_key, &model, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
size = sizeof(numcpus);
if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
*cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos));
if (!(*cpu_infos))
- return -ENOMEM;
+ return UV_ENOMEM;
*count = numcpus;
@@ -327,7 +327,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(maxcpus);
if (sysctlbyname(maxcpus_key, &maxcpus, &size, NULL, 0)) {
uv__free(*cpu_infos);
- return -errno;
+ return UV__ERR(errno);
}
size = maxcpus * CPUSTATES * sizeof(long);
@@ -335,13 +335,13 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
cp_times = uv__malloc(size);
if (cp_times == NULL) {
uv__free(*cpu_infos);
- return -ENOMEM;
+ return UV_ENOMEM;
}
if (sysctlbyname(cptimes_key, cp_times, &size, NULL, 0)) {
uv__free(cp_times);
uv__free(*cpu_infos);
- return -errno;
+ return UV__ERR(errno);
}
for (i = 0; i < numcpus; i++) {
diff --git a/deps/uv/src/unix/fs.c b/deps/uv/src/unix/fs.c
index e0969a4c2f3d91..92e2d255702fd7 100644
--- a/deps/uv/src/unix/fs.c
+++ b/deps/uv/src/unix/fs.c
@@ -67,16 +67,15 @@
#define INIT(subtype) \
do { \
if (req == NULL) \
- return -EINVAL; \
- req->type = UV_FS; \
- if (cb != NULL) \
- uv__req_init(loop, req, UV_FS); \
+ return UV_EINVAL; \
+ UV_REQ_INIT(req, UV_FS); \
req->fs_type = UV_FS_ ## subtype; \
req->result = 0; \
req->ptr = NULL; \
req->loop = loop; \
req->path = NULL; \
req->new_path = NULL; \
+ req->bufs = NULL; \
req->cb = cb; \
} \
while (0)
@@ -88,10 +87,8 @@
req->path = path; \
} else { \
req->path = uv__strdup(path); \
- if (req->path == NULL) { \
- uv__req_unregister(loop, req); \
- return -ENOMEM; \
- } \
+ if (req->path == NULL) \
+ return UV_ENOMEM; \
} \
} \
while (0)
@@ -107,10 +104,8 @@
path_len = strlen(path) + 1; \
new_path_len = strlen(new_path) + 1; \
req->path = uv__malloc(path_len + new_path_len); \
- if (req->path == NULL) { \
- uv__req_unregister(loop, req); \
- return -ENOMEM; \
- } \
+ if (req->path == NULL) \
+ return UV_ENOMEM; \
req->new_path = req->path + path_len; \
memcpy((void*) req->path, path, path_len); \
memcpy((void*) req->new_path, new_path, new_path_len); \
@@ -121,6 +116,7 @@
#define POST \
do { \
if (cb != NULL) { \
+ uv__req_register(loop, req); \
uv__work_submit(loop, &req->work_req, uv__fs_work, uv__fs_done); \
return 0; \
} \
@@ -818,7 +814,7 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) {
/* Get the source file's mode. */
if (fstat(srcfd, &statsbuf)) {
- err = -errno;
+ err = UV__ERR(errno);
goto out;
}
@@ -842,7 +838,7 @@ static ssize_t uv__fs_copyfile(uv_fs_t* req) {
}
if (fchmod(dstfd, statsbuf.st_mode) == -1) {
- err = -errno;
+ err = UV__ERR(errno);
goto out;
}
@@ -1107,7 +1103,7 @@ static void uv__fs_work(struct uv__work* w) {
} while (r == -1 && errno == EINTR && retry_on_eintr);
if (r == -1)
- req->result = -errno;
+ req->result = UV__ERR(errno);
else
req->result = r;
@@ -1125,9 +1121,9 @@ static void uv__fs_done(struct uv__work* w, int status) {
req = container_of(w, uv_fs_t, work_req);
uv__req_unregister(req->loop, req);
- if (status == -ECANCELED) {
+ if (status == UV_ECANCELED) {
assert(req->result == 0);
- req->result = -ECANCELED;
+ req->result = UV_ECANCELED;
}
req->cb(req);
@@ -1288,11 +1284,8 @@ int uv_fs_mkdtemp(uv_loop_t* loop,
uv_fs_cb cb) {
INIT(MKDTEMP);
req->path = uv__strdup(tpl);
- if (req->path == NULL) {
- if (cb != NULL)
- uv__req_unregister(loop, req);
- return -ENOMEM;
- }
+ if (req->path == NULL)
+ return UV_ENOMEM;
POST;
}
@@ -1320,7 +1313,7 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
INIT(READ);
if (bufs == NULL || nbufs == 0)
- return -EINVAL;
+ return UV_EINVAL;
req->file = file;
@@ -1329,11 +1322,8 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
if (nbufs > ARRAY_SIZE(req->bufsml))
req->bufs = uv__malloc(nbufs * sizeof(*bufs));
- if (req->bufs == NULL) {
- if (cb != NULL)
- uv__req_unregister(loop, req);
- return -ENOMEM;
- }
+ if (req->bufs == NULL)
+ return UV_ENOMEM;
memcpy(req->bufs, bufs, nbufs * sizeof(*bufs));
@@ -1459,7 +1449,7 @@ int uv_fs_write(uv_loop_t* loop,
INIT(WRITE);
if (bufs == NULL || nbufs == 0)
- return -EINVAL;
+ return UV_EINVAL;
req->file = file;
@@ -1468,11 +1458,8 @@ int uv_fs_write(uv_loop_t* loop,
if (nbufs > ARRAY_SIZE(req->bufsml))
req->bufs = uv__malloc(nbufs * sizeof(*bufs));
- if (req->bufs == NULL) {
- if (cb != NULL)
- uv__req_unregister(loop, req);
- return -ENOMEM;
- }
+ if (req->bufs == NULL)
+ return UV_ENOMEM;
memcpy(req->bufs, bufs, nbufs * sizeof(*bufs));
@@ -1499,6 +1486,10 @@ void uv_fs_req_cleanup(uv_fs_t* req) {
if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL)
uv__fs_scandir_cleanup(req);
+ if (req->bufs != req->bufsml)
+ uv__free(req->bufs);
+ req->bufs = NULL;
+
if (req->ptr != &req->statbuf)
uv__free(req->ptr);
req->ptr = NULL;
@@ -1514,7 +1505,7 @@ int uv_fs_copyfile(uv_loop_t* loop,
INIT(COPYFILE);
if (flags & ~UV_FS_COPYFILE_EXCL)
- return -EINVAL;
+ return UV_EINVAL;
PATH2;
req->flags = flags;
diff --git a/deps/uv/src/unix/fsevents.c b/deps/uv/src/unix/fsevents.c
index 38837406a66f68..47d8024b6d51ba 100644
--- a/deps/uv/src/unix/fsevents.c
+++ b/deps/uv/src/unix/fsevents.c
@@ -379,7 +379,7 @@ static int uv__fsevents_create_stream(uv_loop_t* loop, CFArrayRef paths) {
if (!pFSEventStreamStart(ref)) {
pFSEventStreamInvalidate(ref);
pFSEventStreamRelease(ref);
- return -EMFILE;
+ return UV_EMFILE;
}
state->fsevent_stream = ref;
@@ -440,7 +440,7 @@ static void uv__fsevents_reschedule(uv_fs_event_t* handle,
uv__fsevents_destroy_stream(handle->loop);
/* Any failure below will be a memory failure */
- err = -ENOMEM;
+ err = UV_ENOMEM;
/* Create list of all watched paths */
uv_mutex_lock(&state->fsevent_mutex);
@@ -474,7 +474,7 @@ static void uv__fsevents_reschedule(uv_fs_event_t* handle,
/* Create new FSEventStream */
cf_paths = pCFArrayCreate(NULL, (const void**) paths, path_count, NULL);
if (cf_paths == NULL) {
- err = -ENOMEM;
+ err = UV_ENOMEM;
goto final;
}
err = uv__fsevents_create_stream(handle->loop, cf_paths);
@@ -528,7 +528,7 @@ static int uv__fsevents_global_init(void) {
* but if it ever becomes one, we can turn the dynamic library handles into
* per-event loop properties and have the dynamic linker keep track for us.
*/
- err = -ENOSYS;
+ err = UV_ENOSYS;
core_foundation_handle = dlopen("/System/Library/Frameworks/"
"CoreFoundation.framework/"
"Versions/A/CoreFoundation",
@@ -543,7 +543,7 @@ static int uv__fsevents_global_init(void) {
if (core_services_handle == NULL)
goto out;
- err = -ENOENT;
+ err = UV_ENOENT;
#define V(handle, symbol) \
do { \
*(void **)(&p ## symbol) = dlsym((handle), #symbol); \
@@ -607,7 +607,7 @@ static int uv__fsevents_loop_init(uv_loop_t* loop) {
state = uv__calloc(1, sizeof(*state));
if (state == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
err = uv_mutex_init(&loop->cf_mutex);
if (err)
@@ -636,7 +636,7 @@ static int uv__fsevents_loop_init(uv_loop_t* loop) {
ctx.perform = uv__cf_loop_cb;
state->signal_source = pCFRunLoopSourceCreate(NULL, 0, &ctx);
if (state->signal_source == NULL) {
- err = -ENOMEM;
+ err = UV_ENOMEM;
goto fail_signal_source_create;
}
@@ -655,7 +655,7 @@ static int uv__fsevents_loop_init(uv_loop_t* loop) {
loop->cf_state = state;
/* uv_thread_t is an alias for pthread_t. */
- err = -pthread_create(&loop->cf_thread, attr, uv__cf_loop_runner, loop);
+ err = UV__ERR(pthread_create(&loop->cf_thread, attr, uv__cf_loop_runner, loop));
if (attr != NULL)
pthread_attr_destroy(attr);
@@ -787,7 +787,7 @@ int uv__cf_loop_signal(uv_loop_t* loop,
item = uv__malloc(sizeof(*item));
if (item == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
item->handle = handle;
item->type = type;
@@ -817,7 +817,7 @@ int uv__fsevents_init(uv_fs_event_t* handle) {
/* Get absolute path to file */
handle->realpath = realpath(handle->path, NULL);
if (handle->realpath == NULL)
- return -errno;
+ return UV__ERR(errno);
handle->realpath_len = strlen(handle->realpath);
/* Initialize event queue */
@@ -830,7 +830,7 @@ int uv__fsevents_init(uv_fs_event_t* handle) {
*/
handle->cf_cb = uv__malloc(sizeof(*handle->cf_cb));
if (handle->cf_cb == NULL) {
- err = -ENOMEM;
+ err = UV_ENOMEM;
goto fail_cf_cb_malloc;
}
@@ -881,7 +881,7 @@ int uv__fsevents_close(uv_fs_event_t* handle) {
uv__cf_loop_state_t* state;
if (handle->cf_cb == NULL)
- return -EINVAL;
+ return UV_EINVAL;
/* Remove handle from the list */
state = handle->loop->cf_state;
@@ -895,7 +895,7 @@ int uv__fsevents_close(uv_fs_event_t* handle) {
assert(handle != NULL);
err = uv__cf_loop_signal(handle->loop, handle, kUVCFLoopSignalClosing);
if (err)
- return -err;
+ return UV__ERR(err);
/* Wait for deinitialization */
uv_sem_wait(&state->fsevent_sem);
diff --git a/deps/uv/src/unix/getaddrinfo.c b/deps/uv/src/unix/getaddrinfo.c
index 0185971697a95d..10e8afd75e831b 100644
--- a/deps/uv/src/unix/getaddrinfo.c
+++ b/deps/uv/src/unix/getaddrinfo.c
@@ -86,7 +86,7 @@ int uv__getaddrinfo_translate_error(int sys_err) {
case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE;
#endif
#if defined(EAI_SYSTEM)
- case EAI_SYSTEM: return -errno;
+ case EAI_SYSTEM: return UV__ERR(errno);
#endif
}
assert(!"unknown EAI_* error code");
@@ -125,7 +125,7 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) {
req->service = NULL;
req->hostname = NULL;
- if (status == -ECANCELED) {
+ if (status == UV_ECANCELED) {
assert(req->retcode == 0);
req->retcode = UV_EAI_CANCELED;
}
@@ -148,7 +148,7 @@ int uv_getaddrinfo(uv_loop_t* loop,
char* buf;
if (req == NULL || (hostname == NULL && service == NULL))
- return -EINVAL;
+ return UV_EINVAL;
hostname_len = hostname ? strlen(hostname) + 1 : 0;
service_len = service ? strlen(service) + 1 : 0;
@@ -156,7 +156,7 @@ int uv_getaddrinfo(uv_loop_t* loop,
buf = uv__malloc(hostname_len + service_len + hints_len);
if (buf == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
uv__req_init(loop, req, UV_GETADDRINFO);
req->loop = loop;
@@ -211,7 +211,7 @@ int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
return UV_EINVAL;
if (if_indextoname(ifindex, ifname_buf) == NULL)
- return -errno;
+ return UV__ERR(errno);
len = strnlen(ifname_buf, sizeof(ifname_buf));
diff --git a/deps/uv/src/unix/getnameinfo.c b/deps/uv/src/unix/getnameinfo.c
index daa798a450e25c..9a4367224c7fa6 100644
--- a/deps/uv/src/unix/getnameinfo.c
+++ b/deps/uv/src/unix/getnameinfo.c
@@ -61,7 +61,7 @@ static void uv__getnameinfo_done(struct uv__work* w, int status) {
uv__req_unregister(req->loop, req);
host = service = NULL;
- if (status == -ECANCELED) {
+ if (status == UV_ECANCELED) {
assert(req->retcode == 0);
req->retcode = UV_EAI_CANCELED;
} else if (req->retcode == 0) {
diff --git a/deps/uv/src/unix/ibmi.c b/deps/uv/src/unix/ibmi.c
index 8380d02db7616d..c50a4e76f84119 100644
--- a/deps/uv/src/unix/ibmi.c
+++ b/deps/uv/src/unix/ibmi.c
@@ -92,7 +92,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
*cpu_infos = uv__malloc(numcpus * sizeof(uv_cpu_info_t));
if (!*cpu_infos) {
- return -ENOMEM;
+ return UV_ENOMEM;
}
cpu_info = *cpu_infos;
diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h
index 3df5c4c3eb8619..2bb3773c068d8e 100644
--- a/deps/uv/src/unix/internal.h
+++ b/deps/uv/src/unix/internal.h
@@ -29,6 +29,7 @@
#include /* strrchr */
#include /* O_CLOEXEC, may be */
#include
+#include
#if defined(__STRICT_ANSI__)
# define inline __inline
diff --git a/deps/uv/src/unix/kqueue.c b/deps/uv/src/unix/kqueue.c
index 5e89bdced4e5f3..a30fd730ff872e 100644
--- a/deps/uv/src/unix/kqueue.c
+++ b/deps/uv/src/unix/kqueue.c
@@ -51,7 +51,7 @@ static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags);
int uv__kqueue_init(uv_loop_t* loop) {
loop->backend_fd = kqueue();
if (loop->backend_fd == -1)
- return -errno;
+ return UV__ERR(errno);
uv__cloexec(loop->backend_fd, 1);
@@ -98,7 +98,7 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
rc = 0;
EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL))
- rc = -errno;
+ rc = UV__ERR(errno);
EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0);
if (rc == 0)
@@ -458,12 +458,12 @@ int uv_fs_event_start(uv_fs_event_t* handle,
int fd;
if (uv__is_active(handle))
- return -EINVAL;
+ return UV_EINVAL;
/* TODO open asynchronously - but how do we report back errors? */
fd = open(path, O_RDONLY);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
uv__handle_start(handle);
uv__io_init(&handle->event_watcher, uv__fs_event, fd);
diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c
index 4d480ce10a2585..b63c25f3c2258f 100644
--- a/deps/uv/src/unix/linux-core.c
+++ b/deps/uv/src/unix/linux-core.c
@@ -101,7 +101,7 @@ int uv__platform_loop_init(uv_loop_t* loop) {
loop->inotify_watchers = NULL;
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -175,7 +175,7 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
rc = 0;
if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_ADD, fd, &e))
if (errno != EEXIST)
- rc = -errno;
+ rc = UV__ERR(errno);
if (rc == 0)
if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, &e))
@@ -485,7 +485,7 @@ int uv_resident_set_memory(size_t* rss) {
while (fd == -1 && errno == EINTR);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
do
n = read(fd, buf, sizeof(buf) - 1);
@@ -493,7 +493,7 @@ int uv_resident_set_memory(size_t* rss) {
uv__close(fd);
if (n == -1)
- return -errno;
+ return UV__ERR(errno);
buf[n] = '\0';
s = strchr(buf, ' ');
@@ -525,7 +525,7 @@ int uv_resident_set_memory(size_t* rss) {
return 0;
err:
- return -EINVAL;
+ return UV_EINVAL;
}
@@ -547,7 +547,7 @@ int uv_uptime(double* uptime) {
}
if (r)
- return -errno;
+ return UV__ERR(errno);
*uptime = now.tv_sec;
return 0;
@@ -559,7 +559,7 @@ static int uv__cpu_num(FILE* statfile_fp, unsigned int* numcpus) {
char buf[1024];
if (!fgets(buf, sizeof(buf), statfile_fp))
- return -EIO;
+ return UV_EIO;
num = 0;
while (fgets(buf, sizeof(buf), statfile_fp)) {
@@ -569,7 +569,7 @@ static int uv__cpu_num(FILE* statfile_fp, unsigned int* numcpus) {
}
if (num == 0)
- return -EIO;
+ return UV_EIO;
*numcpus = num;
return 0;
@@ -587,13 +587,13 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
statfile_fp = uv__open_file("/proc/stat");
if (statfile_fp == NULL)
- return -errno;
+ return UV__ERR(errno);
err = uv__cpu_num(statfile_fp, &numcpus);
if (err < 0)
goto out;
- err = -ENOMEM;
+ err = UV_ENOMEM;
ci = uv__calloc(numcpus, sizeof(*ci));
if (ci == NULL)
goto out;
@@ -667,7 +667,7 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
defined(__x86_64__)
fp = uv__open_file("/proc/cpuinfo");
if (fp == NULL)
- return -errno;
+ return UV__ERR(errno);
while (fgets(buf, sizeof(buf), fp)) {
if (model_idx < numcpus) {
@@ -676,7 +676,7 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */
if (model == NULL) {
fclose(fp);
- return -ENOMEM;
+ return UV_ENOMEM;
}
ci[model_idx++].model = model;
continue;
@@ -695,7 +695,7 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */
if (model == NULL) {
fclose(fp);
- return -ENOMEM;
+ return UV_ENOMEM;
}
ci[model_idx++].model = model;
continue;
@@ -725,7 +725,7 @@ static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) {
while (model_idx < numcpus) {
model = uv__strndup(inferred_model, strlen(inferred_model));
if (model == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
ci[model_idx++].model = model;
}
@@ -854,7 +854,7 @@ static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) {
int uv_interface_addresses(uv_interface_address_t** addresses,
int* count) {
#ifndef HAVE_IFADDRS_H
- return -ENOSYS;
+ return UV_ENOSYS;
#else
struct ifaddrs *addrs, *ent;
uv_interface_address_t* address;
@@ -862,7 +862,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
struct sockaddr_ll *sll;
if (getifaddrs(&addrs))
- return -errno;
+ return UV__ERR(errno);
*count = 0;
*addresses = NULL;
@@ -881,7 +881,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses,
*addresses = uv__malloc(*count * sizeof(**addresses));
if (!(*addresses)) {
freeifaddrs(addrs);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
diff --git a/deps/uv/src/unix/linux-inotify.c b/deps/uv/src/unix/linux-inotify.c
index 5934c5d8cb060e..bcad630fabf112 100644
--- a/deps/uv/src/unix/linux-inotify.c
+++ b/deps/uv/src/unix/linux-inotify.c
@@ -73,11 +73,11 @@ static int new_inotify_fd(void) {
return fd;
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
fd = uv__inotify_init();
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__cloexec(fd, 1);
if (err == 0)
@@ -283,7 +283,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
int wd;
if (uv__is_active(handle))
- return -EINVAL;
+ return UV_EINVAL;
err = init_inotify(handle->loop);
if (err)
@@ -300,7 +300,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
wd = uv__inotify_add_watch(handle->loop->inotify_fd, path, events);
if (wd == -1)
- return -errno;
+ return UV__ERR(errno);
w = find_watcher(handle->loop, wd);
if (w)
@@ -308,7 +308,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
w = uv__malloc(sizeof(*w) + strlen(path) + 1);
if (w == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
w->wd = wd;
w->path = strcpy((char*)(w + 1), path);
diff --git a/deps/uv/src/unix/loop-watcher.c b/deps/uv/src/unix/loop-watcher.c
index 340bb0dfa11350..b8c1c2a7102ac3 100644
--- a/deps/uv/src/unix/loop-watcher.c
+++ b/deps/uv/src/unix/loop-watcher.c
@@ -31,7 +31,7 @@
\
int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \
if (uv__is_active(handle)) return 0; \
- if (cb == NULL) return -EINVAL; \
+ if (cb == NULL) return UV_EINVAL; \
QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue); \
handle->name##_cb = cb; \
uv__handle_start(handle); \
diff --git a/deps/uv/src/unix/netbsd.c b/deps/uv/src/unix/netbsd.c
index 742507233144a1..2605c114bca72d 100644
--- a/deps/uv/src/unix/netbsd.c
+++ b/deps/uv/src/unix/netbsd.c
@@ -82,7 +82,7 @@ int uv_exepath(char* buffer, size_t* size) {
int mib[4];
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
mib[0] = CTL_KERN;
mib[1] = KERN_PROC_ARGS;
@@ -91,7 +91,7 @@ int uv_exepath(char* buffer, size_t* size) {
int_size = ARRAY_SIZE(int_buf);
if (sysctl(mib, 4, int_buf, &int_size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
/* Copy string from the intermediate buffer to outer one with appropriate
* length.
@@ -111,7 +111,7 @@ uint64_t uv_get_free_memory(void) {
int which[] = {CTL_VM, VM_UVMEXP};
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info.free * sysconf(_SC_PAGESIZE);
}
@@ -128,7 +128,7 @@ uint64_t uv_get_total_memory(void) {
size_t size = sizeof(info);
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info;
}
@@ -150,7 +150,7 @@ int uv_set_process_title(const char* title) {
if (process_title == NULL) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOMEM;
+ return UV_ENOMEM;
}
uv__free(process_title);
@@ -167,7 +167,7 @@ int uv_get_process_title(char* buffer, size_t size) {
size_t len;
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
@@ -177,7 +177,7 @@ int uv_get_process_title(char* buffer, size_t size) {
if (size < len) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, process_title, len);
@@ -219,7 +219,7 @@ int uv_resident_set_memory(size_t* rss) {
error:
if (kd) kvm_close(kd);
- return -EPERM;
+ return UV_EPERM;
}
@@ -230,7 +230,7 @@ int uv_uptime(double* uptime) {
static int which[] = {CTL_KERN, KERN_BOOTTIME};
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
now = time(NULL);
@@ -254,12 +254,12 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(model);
if (sysctlbyname("machdep.cpu_brand", &model, &size, NULL, 0) &&
sysctlbyname("hw.model", &model, &size, NULL, 0)) {
- return -errno;
+ return UV__ERR(errno);
}
size = sizeof(numcpus);
if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
*count = numcpus;
/* Only i386 and amd64 have machdep.tsc_freq */
@@ -270,16 +270,16 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = numcpus * CPUSTATES * sizeof(*cp_times);
cp_times = uv__malloc(size);
if (cp_times == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
if (sysctlbyname("kern.cp_time", cp_times, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
*cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos));
if (!(*cpu_infos)) {
uv__free(cp_times);
uv__free(*cpu_infos);
- return -ENOMEM;
+ return UV_ENOMEM;
}
for (i = 0; i < numcpus; i++) {
diff --git a/deps/uv/src/unix/no-fsevents.c b/deps/uv/src/unix/no-fsevents.c
index 38fb6ab0bb2c16..158643af1ef528 100644
--- a/deps/uv/src/unix/no-fsevents.c
+++ b/deps/uv/src/unix/no-fsevents.c
@@ -25,16 +25,16 @@
#include
int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb,
const char* filename, unsigned int flags) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
int uv_fs_event_stop(uv_fs_event_t* handle) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
void uv__fs_event_close(uv_fs_event_t* handle) {
diff --git a/deps/uv/src/unix/no-proctitle.c b/deps/uv/src/unix/no-proctitle.c
index a5c19fbff58d38..165740ca3ff9d5 100644
--- a/deps/uv/src/unix/no-proctitle.c
+++ b/deps/uv/src/unix/no-proctitle.c
@@ -35,7 +35,7 @@ int uv_set_process_title(const char* title) {
int uv_get_process_title(char* buffer, size_t size) {
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
buffer[0] = '\0';
return 0;
diff --git a/deps/uv/src/unix/openbsd.c b/deps/uv/src/unix/openbsd.c
index c0ffa564b4c2e9..ce937cd3efec25 100644
--- a/deps/uv/src/unix/openbsd.c
+++ b/deps/uv/src/unix/openbsd.c
@@ -78,11 +78,11 @@ int uv_exepath(char* buffer, size_t* size) {
int err;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
mypid = getpid();
for (;;) {
- err = -ENOMEM;
+ err = UV_ENOMEM;
argsbuf_tmp = uv__realloc(argsbuf, argsbuf_size);
if (argsbuf_tmp == NULL)
goto out;
@@ -95,14 +95,14 @@ int uv_exepath(char* buffer, size_t* size) {
break;
}
if (errno != ENOMEM) {
- err = -errno;
+ err = UV__ERR(errno);
goto out;
}
argsbuf_size *= 2U;
}
if (argsbuf[0] == NULL) {
- err = -EINVAL; /* FIXME(bnoordhuis) More appropriate error. */
+ err = UV_EINVAL; /* FIXME(bnoordhuis) More appropriate error. */
goto out;
}
@@ -128,7 +128,7 @@ uint64_t uv_get_free_memory(void) {
int which[] = {CTL_VM, VM_UVMEXP};
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info.free * sysconf(_SC_PAGESIZE);
}
@@ -140,7 +140,7 @@ uint64_t uv_get_total_memory(void) {
size_t size = sizeof(info);
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
return (uint64_t) info;
}
@@ -162,7 +162,7 @@ int uv_set_process_title(const char* title) {
if (process_title == NULL) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOMEM;
+ return UV_ENOMEM;
}
uv__free(process_title);
@@ -179,7 +179,7 @@ int uv_get_process_title(char* buffer, size_t size) {
size_t len;
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
@@ -189,7 +189,7 @@ int uv_get_process_title(char* buffer, size_t size) {
if (size < len) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
memcpy(buffer, process_title, len);
@@ -219,7 +219,7 @@ int uv_resident_set_memory(size_t* rss) {
mib[5] = 1;
if (sysctl(mib, 6, &kinfo, &size, NULL, 0) < 0)
- return -errno;
+ return UV__ERR(errno);
*rss = kinfo.p_vm_rssize * page_size;
return 0;
@@ -233,7 +233,7 @@ int uv_uptime(double* uptime) {
static int which[] = {CTL_KERN, KERN_BOOTTIME};
if (sysctl(which, 2, &info, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
now = time(NULL);
@@ -255,16 +255,16 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(model);
if (sysctl(which, 2, &model, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
which[1] = HW_NCPU;
size = sizeof(numcpus);
if (sysctl(which, 2, &numcpus, &size, NULL, 0))
- return -errno;
+ return UV__ERR(errno);
*cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos));
if (!(*cpu_infos))
- return -ENOMEM;
+ return UV_ENOMEM;
*count = numcpus;
@@ -272,7 +272,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(cpuspeed);
if (sysctl(which, 2, &cpuspeed, &size, NULL, 0)) {
uv__free(*cpu_infos);
- return -errno;
+ return UV__ERR(errno);
}
size = sizeof(info);
@@ -283,7 +283,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
size = sizeof(info);
if (sysctl(which, 3, &info, &size, NULL, 0)) {
uv__free(*cpu_infos);
- return -errno;
+ return UV__ERR(errno);
}
cpu_info = &(*cpu_infos)[i];
diff --git a/deps/uv/src/unix/os390.c b/deps/uv/src/unix/os390.c
index 081438e8e73d3c..f766b393395ee7 100644
--- a/deps/uv/src/unix/os390.c
+++ b/deps/uv/src/unix/os390.c
@@ -122,7 +122,7 @@ int uv__platform_loop_init(uv_loop_t* loop) {
ep = epoll_create1(0);
loop->ep = ep;
if (ep == NULL)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -259,12 +259,12 @@ int uv_exepath(char* buffer, size_t* size) {
int pid;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
pid = getpid();
res = getexe(pid, args, sizeof(args));
if (res < 0)
- return -EINVAL;
+ return UV_EINVAL;
/*
* Possibilities for args:
@@ -277,7 +277,7 @@ int uv_exepath(char* buffer, size_t* size) {
/* Case i) and ii) absolute or relative paths */
if (strchr(args, '/') != NULL) {
if (realpath(args, abspath) != abspath)
- return -errno;
+ return UV__ERR(errno);
abspath_size = strlen(abspath);
@@ -297,11 +297,11 @@ int uv_exepath(char* buffer, size_t* size) {
char* path = getenv("PATH");
if (path == NULL)
- return -EINVAL;
+ return UV_EINVAL;
clonedpath = uv__strdup(path);
if (clonedpath == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
token = strtok(clonedpath, ":");
while (token != NULL) {
@@ -327,7 +327,7 @@ int uv_exepath(char* buffer, size_t* size) {
uv__free(clonedpath);
/* Out of tokens (path entries), and no match found */
- return -EINVAL;
+ return UV_EINVAL;
}
}
@@ -407,7 +407,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
*cpu_infos = uv__malloc(*count * sizeof(uv_cpu_info_t));
if (!*cpu_infos)
- return -ENOMEM;
+ return UV_ENOMEM;
cpu_info = *cpu_infos;
idx = 0;
@@ -452,7 +452,7 @@ static int uv__interface_addresses_v6(uv_interface_address_t** addresses,
maxsize = 16384;
if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)))
- return -errno;
+ return UV__ERR(errno);
ifc.__nif6h_version = 1;
ifc.__nif6h_buflen = maxsize;
@@ -460,7 +460,7 @@ static int uv__interface_addresses_v6(uv_interface_address_t** addresses,
if (ioctl(sockfd, SIOCGIFCONF6, &ifc) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
@@ -484,7 +484,7 @@ static int uv__interface_addresses_v6(uv_interface_address_t** addresses,
*addresses = uv__malloc(*count * sizeof(uv_interface_address_t));
if (!(*addresses)) {
uv__close(sockfd);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
@@ -543,13 +543,13 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (0 > sockfd)
- return -errno;
+ return UV__ERR(errno);
ifc.ifc_req = uv__calloc(1, maxsize);
ifc.ifc_len = maxsize;
if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
#define MAX(a,b) (((a)>(b))?(a):(b))
@@ -569,7 +569,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
@@ -584,7 +584,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
if (!(*addresses)) {
uv__close(sockfd);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
@@ -607,7 +607,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name));
if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) {
uv__close(sockfd);
- return -ENOSYS;
+ return UV_ENOSYS;
}
if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING))
@@ -706,7 +706,7 @@ int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb,
int rc;
if (uv__is_active(handle))
- return -EINVAL;
+ return UV_EINVAL;
ep = handle->loop->ep;
assert(ep->msg_queue != -1);
@@ -718,11 +718,11 @@ int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb,
path = uv__strdup(filename);
if (path == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
rc = __w_pioctl(path, _IOCC_REGFILEINT, sizeof(reg_struct), ®_struct);
if (rc != 0)
- return -errno;
+ return UV__ERR(errno);
uv__handle_start(handle);
handle->path = path;
diff --git a/deps/uv/src/unix/pipe.c b/deps/uv/src/unix/pipe.c
index ac7cfb46a927fa..e640bf29fc1754 100644
--- a/deps/uv/src/unix/pipe.c
+++ b/deps/uv/src/unix/pipe.c
@@ -50,12 +50,12 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
/* Already bound? */
if (uv__stream_fd(handle) >= 0)
- return -EINVAL;
+ return UV_EINVAL;
/* Make a copy of the file name, it outlives this function's scope. */
pipe_fname = uv__strdup(name);
if (pipe_fname == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
/* We've got a copy, don't touch the original any more. */
name = NULL;
@@ -71,10 +71,10 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
saddr.sun_family = AF_UNIX;
if (bind(sockfd, (struct sockaddr*)&saddr, sizeof saddr)) {
- err = -errno;
+ err = UV__ERR(errno);
/* Convert ENOENT to EACCES for compatibility with Windows. */
- if (err == -ENOENT)
- err = -EACCES;
+ if (err == UV_ENOENT)
+ err = UV_EACCES;
uv__close(sockfd);
goto err_socket;
@@ -94,7 +94,7 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
if (uv__stream_fd(handle) == -1)
- return -EINVAL;
+ return UV_EINVAL;
#if defined(__MVS__)
/* On zOS, backlog=0 has undefined behaviour */
@@ -105,7 +105,7 @@ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
#endif
if (listen(uv__stream_fd(handle), backlog))
- return -errno;
+ return UV__ERR(errno);
handle->connection_cb = cb;
handle->io_watcher.cb = uv__server_io;
@@ -180,14 +180,14 @@ void uv_pipe_connect(uv_connect_t* req,
while (r == -1 && errno == EINTR);
if (r == -1 && errno != EINPROGRESS) {
- err = -errno;
+ err = UV__ERR(errno);
#if defined(__CYGWIN__) || defined(__MSYS__)
/* EBADF is supposed to mean that the socket fd is bad, but
Cygwin reports EBADF instead of ENOTSOCK when the file is
not a socket. We do not expect to see a bad fd here
(e.g. due to new_sock), so translate the error. */
- if (err == -EBADF)
- err = -ENOTSOCK;
+ if (err == UV_EBADF)
+ err = UV_ENOTSOCK;
#endif
goto out;
}
@@ -234,7 +234,7 @@ static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
err = func(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen);
if (err < 0) {
*size = 0;
- return -errno;
+ return UV__ERR(errno);
}
#if defined(__linux__)
@@ -312,15 +312,15 @@ int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
int r;
if (handle == NULL || uv__stream_fd(handle) == -1)
- return -EBADF;
+ return UV_EBADF;
if (mode != UV_READABLE &&
mode != UV_WRITABLE &&
mode != (UV_WRITABLE | UV_READABLE))
- return -EINVAL;
+ return UV_EINVAL;
if (fstat(uv__stream_fd(handle), &pipe_stat) == -1)
- return -errno;
+ return UV__ERR(errno);
desired_mode = 0;
if (mode & UV_READABLE)
@@ -353,5 +353,5 @@ int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
r = chmod(name_buffer, pipe_stat.st_mode);
uv__free(name_buffer);
- return r != -1 ? 0 : -errno;
+ return r != -1 ? 0 : UV__ERR(errno);
}
diff --git a/deps/uv/src/unix/poll.c b/deps/uv/src/unix/poll.c
index 816c7dc2eb9e0b..f3b0bf4e433942 100644
--- a/deps/uv/src/unix/poll.c
+++ b/deps/uv/src/unix/poll.c
@@ -47,7 +47,7 @@ static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
if ((events & POLLERR) && !(events & UV__POLLPRI)) {
uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
uv__handle_stop(handle);
- handle->poll_cb(handle, -EBADF, 0);
+ handle->poll_cb(handle, UV_EBADF, 0);
return;
}
@@ -76,7 +76,7 @@ int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) {
* Workaround for e.g. kqueue fds not supporting ioctls.
*/
err = uv__nonblock(fd, 1);
- if (err == -ENOTTY)
+ if (err == UV_ENOTTY)
if (uv__nonblock == uv__nonblock_ioctl)
err = uv__nonblock_fcntl(fd, 1);
diff --git a/deps/uv/src/unix/posix-poll.c b/deps/uv/src/unix/posix-poll.c
index 3fba96e1bf154d..f356e76c79daec 100644
--- a/deps/uv/src/unix/posix-poll.c
+++ b/deps/uv/src/unix/posix-poll.c
@@ -315,10 +315,10 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) {
while (rv == -1 && (errno == EINTR || errno == EAGAIN));
if (rv == -1)
- return -errno;
+ return UV__ERR(errno);
if (p[0].revents & POLLNVAL)
- return -EINVAL;
+ return UV_EINVAL;
return 0;
}
diff --git a/deps/uv/src/unix/process.c b/deps/uv/src/unix/process.c
index 9842710d0ea159..74113e3a696cc2 100644
--- a/deps/uv/src/unix/process.c
+++ b/deps/uv/src/unix/process.c
@@ -126,7 +126,7 @@ int uv__make_socketpair(int fds[2], int flags) {
* Anything else is a genuine error.
*/
if (errno != EINVAL)
- return -errno;
+ return UV__ERR(errno);
no_cloexec = 1;
@@ -134,7 +134,7 @@ int uv__make_socketpair(int fds[2], int flags) {
#endif
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))
- return -errno;
+ return UV__ERR(errno);
uv__cloexec(fds[0], 1);
uv__cloexec(fds[1], 1);
@@ -159,7 +159,7 @@ int uv__make_pipe(int fds[2], int flags) {
return 0;
if (errno != ENOSYS)
- return -errno;
+ return UV__ERR(errno);
no_pipe2 = 1;
@@ -167,7 +167,7 @@ int uv__make_pipe(int fds[2], int flags) {
#endif
if (pipe(fds))
- return -errno;
+ return UV__ERR(errno);
uv__cloexec(fds[0], 1);
uv__cloexec(fds[1], 1);
@@ -198,7 +198,7 @@ static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2]) {
case UV_CREATE_PIPE:
assert(container->data.stream != NULL);
if (container->data.stream->type != UV_NAMED_PIPE)
- return -EINVAL;
+ return UV_EINVAL;
else
return uv__make_socketpair(fds, 0);
@@ -210,14 +210,14 @@ static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2]) {
fd = uv__stream_fd(container->data.stream);
if (fd == -1)
- return -EINVAL;
+ return UV_EINVAL;
fds[1] = fd;
return 0;
default:
assert(0 && "Unexpected flags");
- return -EINVAL;
+ return UV_EINVAL;
}
}
@@ -299,7 +299,7 @@ static void uv__process_child_init(const uv_process_options_t* options,
continue;
pipes[fd][1] = fcntl(use_fd, F_DUPFD, stdio_count);
if (pipes[fd][1] == -1) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
}
@@ -319,7 +319,7 @@ static void uv__process_child_init(const uv_process_options_t* options,
close_fd = use_fd;
if (use_fd == -1) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
}
@@ -331,7 +331,7 @@ static void uv__process_child_init(const uv_process_options_t* options,
fd = dup2(use_fd, fd);
if (fd == -1) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
@@ -350,7 +350,7 @@ static void uv__process_child_init(const uv_process_options_t* options,
}
if (options->cwd != NULL && chdir(options->cwd)) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
@@ -366,12 +366,12 @@ static void uv__process_child_init(const uv_process_options_t* options,
}
if ((options->flags & UV_PROCESS_SETGID) && setgid(options->gid)) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
if ((options->flags & UV_PROCESS_SETUID) && setuid(options->uid)) {
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
@@ -391,7 +391,7 @@ static void uv__process_child_init(const uv_process_options_t* options,
if (SIG_ERR != signal(n, SIG_DFL))
continue;
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
@@ -400,12 +400,12 @@ static void uv__process_child_init(const uv_process_options_t* options,
err = pthread_sigmask(SIG_SETMASK, &set, NULL);
if (err != 0) {
- uv__write_int(error_fd, -err);
+ uv__write_int(error_fd, UV__ERR(err));
_exit(127);
}
execvp(options->file, options->args);
- uv__write_int(error_fd, -errno);
+ uv__write_int(error_fd, UV__ERR(errno));
_exit(127);
}
#endif
@@ -416,7 +416,7 @@ int uv_spawn(uv_loop_t* loop,
const uv_process_options_t* options) {
#if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
/* fork is marked __WATCHOS_PROHIBITED __TVOS_PROHIBITED. */
- return -ENOSYS;
+ return UV_ENOSYS;
#else
int signal_pipe[2] = { -1, -1 };
int pipes_storage[8][2];
@@ -443,7 +443,7 @@ int uv_spawn(uv_loop_t* loop,
if (stdio_count < 3)
stdio_count = 3;
- err = -ENOMEM;
+ err = UV_ENOMEM;
pipes = pipes_storage;
if (stdio_count > (int) ARRAY_SIZE(pipes_storage))
pipes = uv__malloc(stdio_count * sizeof(*pipes));
@@ -493,7 +493,7 @@ int uv_spawn(uv_loop_t* loop,
pid = fork();
if (pid == -1) {
- err = -errno;
+ err = UV__ERR(errno);
uv_rwlock_wrunlock(&loop->cloexec_lock);
uv__close(signal_pipe[0]);
uv__close(signal_pipe[1]);
@@ -585,7 +585,7 @@ int uv_process_kill(uv_process_t* process, int signum) {
int uv_kill(int pid, int signum) {
if (kill(pid, signum))
- return -errno;
+ return UV__ERR(errno);
else
return 0;
}
diff --git a/deps/uv/src/unix/procfs-exepath.c b/deps/uv/src/unix/procfs-exepath.c
index 5fdb6115505661..00dc021f21e71f 100644
--- a/deps/uv/src/unix/procfs-exepath.c
+++ b/deps/uv/src/unix/procfs-exepath.c
@@ -29,14 +29,14 @@ int uv_exepath(char* buffer, size_t* size) {
ssize_t n;
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
n = *size - 1;
if (n > 0)
n = readlink("/proc/self/exe", buffer, n);
if (n == -1)
- return -errno;
+ return UV__ERR(errno);
buffer[n] = '\0';
*size = n;
diff --git a/deps/uv/src/unix/proctitle.c b/deps/uv/src/unix/proctitle.c
index 1b3a798820e282..1a8c7a7090e8a6 100644
--- a/deps/uv/src/unix/proctitle.c
+++ b/deps/uv/src/unix/proctitle.c
@@ -105,14 +105,14 @@ int uv_set_process_title(const char* title) {
int uv_get_process_title(char* buffer, size_t size) {
if (buffer == NULL || size == 0)
- return -EINVAL;
+ return UV_EINVAL;
uv_once(&process_title_mutex_once, init_process_title_mutex_once);
uv_mutex_lock(&process_title_mutex);
if (size <= process_title.len) {
uv_mutex_unlock(&process_title_mutex);
- return -ENOBUFS;
+ return UV_ENOBUFS;
}
if (process_title.len != 0)
diff --git a/deps/uv/src/unix/signal.c b/deps/uv/src/unix/signal.c
index 3759778011223f..b9d0a56084c6b3 100644
--- a/deps/uv/src/unix/signal.c
+++ b/deps/uv/src/unix/signal.c
@@ -225,7 +225,7 @@ static int uv__signal_register_handler(int signum, int oneshot) {
/* XXX save old action so we can restore it later on? */
if (sigaction(signum, &sa, NULL))
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -362,7 +362,7 @@ static int uv__signal_start(uv_signal_t* handle,
* eventually.
*/
if (signum == 0)
- return -EINVAL;
+ return UV_EINVAL;
/* Short circuit: if the signal watcher is already watching {signum} don't
* go through the process of deregistering and registering the handler.
diff --git a/deps/uv/src/unix/stream.c b/deps/uv/src/unix/stream.c
index 6fc0a01f5a51a6..3e786abee015c4 100644
--- a/deps/uv/src/unix/stream.c
+++ b/deps/uv/src/unix/stream.c
@@ -58,6 +58,12 @@ struct uv__stream_select_s {
fd_set* swrite;
size_t swrite_sz;
};
+# define WRITE_RETRY_ON_ERROR(send_handle) \
+ (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || \
+ (errno == EMSGSIZE && send_handle))
+#else
+# define WRITE_RETRY_ON_ERROR(send_handle) \
+ (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
#endif /* defined(__APPLE__) */
static void uv__stream_connect(uv_stream_t*);
@@ -282,7 +288,7 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) {
kq = kqueue();
if (kq == -1) {
perror("(libuv) kqueue()");
- return -errno;
+ return UV__ERR(errno);
}
EV_SET(&filter[0], *fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0);
@@ -298,7 +304,7 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) {
uv__close(kq);
if (ret == -1)
- return -errno;
+ return UV__ERR(errno);
if (ret == 0 || (events[0].flags & EV_ERROR) == 0 || events[0].data != EINVAL)
return 0;
@@ -310,7 +316,7 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) {
* NOTE: do it ahead of malloc below to allocate enough space for fd_sets
*/
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))
- return -errno;
+ return UV__ERR(errno);
max_fd = *fd;
if (fds[1] > max_fd)
@@ -321,7 +327,7 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) {
s = uv__malloc(sizeof(*s) + sread_sz + swrite_sz);
if (s == NULL) {
- err = -ENOMEM;
+ err = UV_ENOMEM;
goto failed_malloc;
}
@@ -395,18 +401,18 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
#endif
if (!(stream->io_watcher.fd == -1 || stream->io_watcher.fd == fd))
- return -EBUSY;
+ return UV_EBUSY;
assert(fd >= 0);
stream->flags |= flags;
if (stream->type == UV_TCP) {
if ((stream->flags & UV_TCP_NODELAY) && uv__tcp_nodelay(fd, 1))
- return -errno;
+ return UV__ERR(errno);
/* TODO Use delay the user passed in. */
if ((stream->flags & UV_TCP_KEEPALIVE) && uv__tcp_keepalive(fd, 1, 60))
- return -errno;
+ return UV__ERR(errno);
}
#if defined(__APPLE__)
@@ -414,7 +420,7 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &enable, sizeof(enable)) &&
errno != ENOTSOCK &&
errno != EINVAL) {
- return -errno;
+ return UV__ERR(errno);
}
#endif
@@ -445,11 +451,11 @@ void uv__stream_destroy(uv_stream_t* stream) {
if (stream->connect_req) {
uv__req_unregister(stream->loop, stream->connect_req);
- stream->connect_req->cb(stream->connect_req, -ECANCELED);
+ stream->connect_req->cb(stream->connect_req, UV_ECANCELED);
stream->connect_req = NULL;
}
- uv__stream_flush_write_queue(stream, -ECANCELED);
+ uv__stream_flush_write_queue(stream, UV_ECANCELED);
uv__write_callbacks(stream);
if (stream->shutdown_req) {
@@ -459,7 +465,7 @@ void uv__stream_destroy(uv_stream_t* stream) {
* callee that the handle has been destroyed.
*/
uv__req_unregister(stream->loop, stream->shutdown_req);
- stream->shutdown_req->cb(stream->shutdown_req, -ECANCELED);
+ stream->shutdown_req->cb(stream->shutdown_req, UV_ECANCELED);
stream->shutdown_req = NULL;
}
@@ -483,7 +489,7 @@ static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) {
int emfile_fd;
if (loop->emfile_fd == -1)
- return -EMFILE;
+ return UV_EMFILE;
uv__close(loop->emfile_fd);
loop->emfile_fd = -1;
@@ -492,7 +498,7 @@ static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) {
err = uv__accept(accept_fd);
if (err >= 0)
uv__close(err);
- } while (err >= 0 || err == -EINTR);
+ } while (err >= 0 || err == UV_EINTR);
emfile_fd = uv__open_cloexec("/", O_RDONLY);
if (emfile_fd >= 0)
@@ -533,15 +539,15 @@ void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
err = uv__accept(uv__stream_fd(stream));
if (err < 0) {
- if (err == -EAGAIN || err == -EWOULDBLOCK)
+ if (err == UV_EAGAIN || err == UV__ERR(EWOULDBLOCK))
return; /* Not an error. */
- if (err == -ECONNABORTED)
+ if (err == UV_ECONNABORTED)
continue; /* Ignore. Nothing we can do about that. */
- if (err == -EMFILE || err == -ENFILE) {
+ if (err == UV_EMFILE || err == UV_ENFILE) {
err = uv__emfile_trick(loop, uv__stream_fd(stream));
- if (err == -EAGAIN || err == -EWOULDBLOCK)
+ if (err == UV_EAGAIN || err == UV__ERR(EWOULDBLOCK))
break;
}
@@ -577,7 +583,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
assert(server->loop == client->loop);
if (server->accepted_fd == -1)
- return -EAGAIN;
+ return UV_EAGAIN;
switch (client->type) {
case UV_NAMED_PIPE:
@@ -601,7 +607,7 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
break;
default:
- return -EINVAL;
+ return UV_EINVAL;
}
client->flags |= UV_HANDLE_BOUND;
@@ -649,7 +655,7 @@ int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) {
break;
default:
- err = -EINVAL;
+ err = UV_EINVAL;
}
if (err == 0)
@@ -680,7 +686,7 @@ static void uv__drain(uv_stream_t* stream) {
err = 0;
if (shutdown(uv__stream_fd(stream), SHUT_WR))
- err = -errno;
+ err = UV__ERR(errno);
if (err == 0)
stream->flags |= UV_STREAM_SHUT;
@@ -792,7 +798,7 @@ static void uv__write(uv_stream_t* stream) {
} scratch;
if (uv__is_closing(req->send_handle)) {
- err = -EBADF;
+ err = UV_EBADF;
goto error;
}
@@ -859,8 +865,8 @@ static void uv__write(uv_stream_t* stream) {
}
if (n < 0) {
- if (errno != EAGAIN && errno != EWOULDBLOCK && errno != ENOBUFS) {
- err = -errno;
+ if (!WRITE_RETRY_ON_ERROR(req->send_handle)) {
+ err = UV__ERR(errno);
goto error;
} else if (stream->flags & UV_STREAM_BLOCKING) {
/* If this is a blocking stream, try again. */
@@ -1029,7 +1035,7 @@ static int uv__stream_queue_fd(uv_stream_t* stream, int fd) {
queued_fds = uv__malloc((queue_size - 1) * sizeof(*queued_fds->fds) +
sizeof(*queued_fds));
if (queued_fds == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
queued_fds->size = queue_size;
queued_fds->offset = 0;
stream->queued_fds = queued_fds;
@@ -1046,7 +1052,7 @@ static int uv__stream_queue_fd(uv_stream_t* stream, int fd) {
* NOTE: if it is fatal - sockets will be closed in uv__stream_close
*/
if (queued_fds == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
queued_fds->size = queue_size;
stream->queued_fds = queued_fds;
}
@@ -1192,7 +1198,7 @@ static void uv__read(uv_stream_t* stream) {
#endif
} else {
/* Error. User should call uv_close(). */
- stream->read_cb(stream, -errno, &buf);
+ stream->read_cb(stream, UV__ERR(errno), &buf);
if (stream->flags & UV_STREAM_READING) {
stream->flags &= ~UV_STREAM_READING;
uv__io_stop(stream->loop, &stream->io_watcher, POLLIN);
@@ -1269,7 +1275,7 @@ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
stream->flags & UV_STREAM_SHUT ||
stream->flags & UV_STREAM_SHUTTING ||
uv__is_closing(stream)) {
- return -ENOTCONN;
+ return UV_ENOTCONN;
}
assert(uv__stream_fd(stream) >= 0);
@@ -1368,10 +1374,10 @@ static void uv__stream_connect(uv_stream_t* stream) {
SO_ERROR,
&error,
&errorsize);
- error = -error;
+ error = UV__ERR(error);
}
- if (error == -EINPROGRESS)
+ if (error == UV__ERR(EINPROGRESS))
return;
stream->connect_req = NULL;
@@ -1388,7 +1394,7 @@ static void uv__stream_connect(uv_stream_t* stream) {
return;
if (error < 0) {
- uv__stream_flush_write_queue(stream, -ECANCELED);
+ uv__stream_flush_write_queue(stream, UV_ECANCELED);
uv__write_callbacks(stream);
}
}
@@ -1409,11 +1415,11 @@ int uv_write2(uv_write_t* req,
"uv_write (unix) does not yet support other types of streams");
if (uv__stream_fd(stream) < 0)
- return -EBADF;
+ return UV_EBADF;
if (send_handle) {
if (stream->type != UV_NAMED_PIPE || !((uv_pipe_t*)stream)->ipc)
- return -EINVAL;
+ return UV_EINVAL;
/* XXX We abuse uv_write2() to send over UDP handles to child processes.
* Don't call uv__stream_fd() on those handles, it's a macro that on OS X
@@ -1422,12 +1428,12 @@ int uv_write2(uv_write_t* req,
* which works but only by accident.
*/
if (uv__handle_fd((uv_handle_t*) send_handle) < 0)
- return -EBADF;
+ return UV_EBADF;
#if defined(__CYGWIN__) || defined(__MSYS__)
/* Cygwin recvmsg always sets msg_controllen to zero, so we cannot send it.
See https://github.com/mirror/newlib-cygwin/blob/86fc4bf0/winsup/cygwin/fhandler_socket.cc#L1736-L1743 */
- return -ENOSYS;
+ return UV_ENOSYS;
#endif
}
@@ -1452,7 +1458,7 @@ int uv_write2(uv_write_t* req,
req->bufs = uv__malloc(nbufs * sizeof(bufs[0]));
if (req->bufs == NULL)
- return -ENOMEM;
+ return UV_ENOMEM;
memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0]));
req->nbufs = nbufs;
@@ -1516,7 +1522,7 @@ int uv_try_write(uv_stream_t* stream,
/* Connecting or already writing some data */
if (stream->connect_req != NULL || stream->write_queue_size != 0)
- return -EAGAIN;
+ return UV_EAGAIN;
has_pollout = uv__io_active(&stream->io_watcher, POLLOUT);
@@ -1547,7 +1553,7 @@ int uv_try_write(uv_stream_t* stream,
}
if (written == 0 && req_size != 0)
- return -EAGAIN;
+ return UV_EAGAIN;
else
return written;
}
@@ -1560,7 +1566,7 @@ int uv_read_start(uv_stream_t* stream,
stream->type == UV_TTY);
if (stream->flags & UV_CLOSING)
- return -EINVAL;
+ return UV_EINVAL;
/* The UV_STREAM_READING flag is irrelevant of the state of the tcp - it just
* expresses the desired state of the user.
diff --git a/deps/uv/src/unix/sunos.c b/deps/uv/src/unix/sunos.c
index a72c26a01f0a65..b6b3dfea77a8d7 100644
--- a/deps/uv/src/unix/sunos.c
+++ b/deps/uv/src/unix/sunos.c
@@ -73,7 +73,7 @@ int uv__platform_loop_init(uv_loop_t* loop) {
fd = port_create();
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
err = uv__cloexec(fd, 1);
if (err) {
@@ -132,7 +132,7 @@ void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
int uv__io_check_fd(uv_loop_t* loop, int fd) {
if (port_associate(loop->backend_fd, PORT_SOURCE_FD, fd, POLLIN, 0))
- return -errno;
+ return UV__ERR(errno);
if (port_dissociate(loop->backend_fd, PORT_SOURCE_FD, fd))
abort();
@@ -342,7 +342,7 @@ int uv_exepath(char* buffer, size_t* size) {
char buf[128];
if (buffer == NULL || size == NULL || *size == 0)
- return -EINVAL;
+ return UV_EINVAL;
snprintf(buf, sizeof(buf), "/proc/%lu/path/a.out", (unsigned long) getpid());
@@ -351,7 +351,7 @@ int uv_exepath(char* buffer, size_t* size) {
res = readlink(buf, buffer, res);
if (res == -1)
- return -errno;
+ return UV__ERR(errno);
buffer[res] = '\0';
*size = res;
@@ -378,14 +378,14 @@ void uv_loadavg(double avg[3]) {
static int uv__fs_event_rearm(uv_fs_event_t *handle) {
if (handle->fd == -1)
- return -EBADF;
+ return UV_EBADF;
if (port_associate(handle->loop->fs_fd,
PORT_SOURCE_FILE,
(uintptr_t) &handle->fo,
FILE_ATTRIB | FILE_MODIFIED,
handle) == -1) {
- return -errno;
+ return UV__ERR(errno);
}
handle->fd = PORT_LOADED;
@@ -462,13 +462,13 @@ int uv_fs_event_start(uv_fs_event_t* handle,
int err;
if (uv__is_active(handle))
- return -EINVAL;
+ return UV_EINVAL;
first_run = 0;
if (handle->loop->fs_fd == -1) {
portfd = port_create();
if (portfd == -1)
- return -errno;
+ return UV__ERR(errno);
handle->loop->fs_fd = portfd;
first_run = 1;
}
@@ -521,7 +521,7 @@ void uv__fs_event_close(uv_fs_event_t* handle) {
#else /* !defined(PORT_SOURCE_FILE) */
int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
@@ -529,12 +529,12 @@ int uv_fs_event_start(uv_fs_event_t* handle,
uv_fs_event_cb cb,
const char* filename,
unsigned int flags) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
int uv_fs_event_stop(uv_fs_event_t* handle) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
@@ -552,10 +552,10 @@ int uv_resident_set_memory(size_t* rss) {
fd = open("/proc/self/psinfo", O_RDONLY);
if (fd == -1)
- return -errno;
+ return UV__ERR(errno);
/* FIXME(bnoordhuis) Handle EINTR. */
- err = -EINVAL;
+ err = UV_EINVAL;
if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) {
*rss = (size_t)psinfo.pr_rssize * 1024;
err = 0;
@@ -575,7 +575,7 @@ int uv_uptime(double* uptime) {
kc = kstat_open();
if (kc == NULL)
- return -EPERM;
+ return UV_EPERM;
ksp = kstat_lookup(kc, (char*) "unix", 0, (char*) "system_misc");
if (kstat_read(kc, ksp, NULL) == -1) {
@@ -599,7 +599,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
kc = kstat_open();
if (kc == NULL)
- return -EPERM;
+ return UV_EPERM;
/* Get count of cpus */
lookup_instance = 0;
@@ -610,7 +610,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
*cpu_infos = uv__malloc(lookup_instance * sizeof(**cpu_infos));
if (!(*cpu_infos)) {
kstat_close(kc);
- return -ENOMEM;
+ return UV_ENOMEM;
}
*count = lookup_instance;
@@ -692,7 +692,7 @@ void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) {
#ifdef SUNOS_NO_IFADDRS
int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
- return -ENOSYS;
+ return UV_ENOSYS;
}
#else /* SUNOS_NO_IFADDRS */
/*
@@ -730,11 +730,11 @@ static int uv__set_phys_addr(uv_interface_address_t* address,
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
- return -errno;
+ return UV__ERR(errno);
if (ioctl(sockfd, SIOCGARP, (char*)&arpreq) == -1) {
uv__close(sockfd);
- return -errno;
+ return UV__ERR(errno);
}
memcpy(address->phys_addr, arpreq.arp_ha.sa_data, sizeof(address->phys_addr));
uv__close(sockfd);
@@ -759,7 +759,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
struct ifaddrs* ent;
if (getifaddrs(&addrs))
- return -errno;
+ return UV__ERR(errno);
*count = 0;
@@ -773,7 +773,7 @@ int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {
*addresses = uv__malloc(*count * sizeof(**addresses));
if (!(*addresses)) {
freeifaddrs(addrs);
- return -ENOMEM;
+ return UV_ENOMEM;
}
address = *addresses;
diff --git a/deps/uv/src/unix/tcp.c b/deps/uv/src/unix/tcp.c
index c7c8d21c668080..96f89312def0eb 100644
--- a/deps/uv/src/unix/tcp.c
+++ b/deps/uv/src/unix/tcp.c
@@ -89,7 +89,7 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
slen = sizeof(saddr);
memset(&saddr, 0, sizeof(saddr));
if (getsockname(uv__stream_fd(handle), (struct sockaddr*) &saddr, &slen))
- return -errno;
+ return UV__ERR(errno);
if ((saddr.ss_family == AF_INET6 &&
((struct sockaddr_in6*) &saddr)->sin6_port != 0) ||
@@ -102,7 +102,7 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
/* Bind to arbitrary port */
if (bind(uv__stream_fd(handle), (struct sockaddr*) &saddr, slen))
- return -errno;
+ return UV__ERR(errno);
}
handle->flags |= flags;
@@ -119,10 +119,10 @@ int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* tcp, unsigned int flags) {
/* Use the lower 8 bits for the domain */
domain = flags & 0xFF;
if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
- return -EINVAL;
+ return UV_EINVAL;
if (flags & ~0xFF)
- return -EINVAL;
+ return UV_EINVAL;
uv__stream_init(loop, (uv_stream_t*)tcp, UV_TCP);
@@ -156,7 +156,7 @@ int uv__tcp_bind(uv_tcp_t* tcp,
/* Cannot set IPv6-only mode on non-IPv6 socket. */
if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6)
- return -EINVAL;
+ return UV_EINVAL;
err = maybe_new_socket(tcp,
addr->sa_family,
@@ -166,7 +166,7 @@ int uv__tcp_bind(uv_tcp_t* tcp,
on = 1;
if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
- return -errno;
+ return UV__ERR(errno);
#ifdef IPV6_V6ONLY
if (addr->sa_family == AF_INET6) {
@@ -178,9 +178,9 @@ int uv__tcp_bind(uv_tcp_t* tcp,
sizeof on) == -1) {
#if defined(__MVS__)
if (errno == EOPNOTSUPP)
- return -EINVAL;
+ return UV_EINVAL;
#endif
- return -errno;
+ return UV__ERR(errno);
}
}
#endif
@@ -190,10 +190,10 @@ int uv__tcp_bind(uv_tcp_t* tcp,
if (errno == EAFNOSUPPORT)
/* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a
* socket created with AF_INET to an AF_INET6 address or vice versa. */
- return -EINVAL;
- return -errno;
+ return UV_EINVAL;
+ return UV__ERR(errno);
}
- tcp->delayed_error = -errno;
+ tcp->delayed_error = UV__ERR(errno);
tcp->flags |= UV_HANDLE_BOUND;
if (addr->sa_family == AF_INET6)
@@ -214,7 +214,7 @@ int uv__tcp_connect(uv_connect_t* req,
assert(handle->type == UV_TCP);
if (handle->connect_req != NULL)
- return -EALREADY; /* FIXME(bnoordhuis) -EINVAL or maybe -EBUSY. */
+ return UV_EALREADY; /* FIXME(bnoordhuis) UV_EINVAL or maybe UV_EBUSY. */
err = maybe_new_socket(handle,
addr->sa_family,
@@ -242,9 +242,9 @@ int uv__tcp_connect(uv_connect_t* req,
* error. Solaris wants to report immediately--other unixes want to
* wait.
*/
- handle->delayed_error = -errno;
+ handle->delayed_error = UV__ERR(errno);
else
- return -errno;
+ return UV__ERR(errno);
}
uv__req_init(handle->loop, req, UV_CONNECT);
@@ -284,13 +284,13 @@ int uv_tcp_getsockname(const uv_tcp_t* handle,
return handle->delayed_error;
if (uv__stream_fd(handle) < 0)
- return -EINVAL; /* FIXME(bnoordhuis) -EBADF */
+ return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t) *namelen;
if (getsockname(uv__stream_fd(handle), name, &socklen))
- return -errno;
+ return UV__ERR(errno);
*namelen = (int) socklen;
return 0;
@@ -306,13 +306,13 @@ int uv_tcp_getpeername(const uv_tcp_t* handle,
return handle->delayed_error;
if (uv__stream_fd(handle) < 0)
- return -EINVAL; /* FIXME(bnoordhuis) -EBADF */
+ return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t) *namelen;
if (getpeername(uv__stream_fd(handle), name, &socklen))
- return -errno;
+ return UV__ERR(errno);
*namelen = (int) socklen;
return 0;
@@ -348,7 +348,7 @@ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
return err;
if (listen(tcp->io_watcher.fd, backlog))
- return -errno;
+ return UV__ERR(errno);
tcp->connection_cb = cb;
tcp->flags |= UV_HANDLE_BOUND;
@@ -363,18 +363,18 @@ int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) {
int uv__tcp_nodelay(int fd, int on) {
if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)))
- return -errno;
+ return UV__ERR(errno);
return 0;
}
int uv__tcp_keepalive(int fd, int on, unsigned int delay) {
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)))
- return -errno;
+ return UV__ERR(errno);
#ifdef TCP_KEEPIDLE
if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay)))
- return -errno;
+ return UV__ERR(errno);
#endif
/* Solaris/SmartOS, if you don't support keep-alive,
@@ -383,7 +383,7 @@ int uv__tcp_keepalive(int fd, int on, unsigned int delay) {
/* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */
#if defined(TCP_KEEPALIVE) && !defined(__sun)
if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay)))
- return -errno;
+ return UV__ERR(errno);
#endif
return 0;
diff --git a/deps/uv/src/unix/thread.c b/deps/uv/src/unix/thread.c
index abaca295d247c3..3def29457aafb6 100644
--- a/deps/uv/src/unix/thread.c
+++ b/deps/uv/src/unix/thread.c
@@ -200,7 +200,7 @@ int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) {
if (attr != NULL)
pthread_attr_destroy(attr);
- return -err;
+ return UV__ERR(err);
}
@@ -209,7 +209,7 @@ uv_thread_t uv_thread_self(void) {
}
int uv_thread_join(uv_thread_t *tid) {
- return -pthread_join(*tid, NULL);
+ return UV__ERR(pthread_join(*tid, NULL));
}
@@ -220,7 +220,7 @@ int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) {
int uv_mutex_init(uv_mutex_t* mutex) {
#if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK)
- return -pthread_mutex_init(mutex, NULL);
+ return UV__ERR(pthread_mutex_init(mutex, NULL));
#else
pthread_mutexattr_t attr;
int err;
@@ -236,7 +236,7 @@ int uv_mutex_init(uv_mutex_t* mutex) {
if (pthread_mutexattr_destroy(&attr))
abort();
- return -err;
+ return UV__ERR(err);
#endif
}
@@ -256,7 +256,7 @@ int uv_mutex_init_recursive(uv_mutex_t* mutex) {
if (pthread_mutexattr_destroy(&attr))
abort();
- return -err;
+ return UV__ERR(err);
}
@@ -279,7 +279,7 @@ int uv_mutex_trylock(uv_mutex_t* mutex) {
if (err) {
if (err != EBUSY && err != EAGAIN)
abort();
- return -EBUSY;
+ return UV_EBUSY;
}
return 0;
@@ -293,7 +293,7 @@ void uv_mutex_unlock(uv_mutex_t* mutex) {
int uv_rwlock_init(uv_rwlock_t* rwlock) {
- return -pthread_rwlock_init(rwlock, NULL);
+ return UV__ERR(pthread_rwlock_init(rwlock, NULL));
}
@@ -316,7 +316,7 @@ int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) {
if (err) {
if (err != EBUSY && err != EAGAIN)
abort();
- return -EBUSY;
+ return UV_EBUSY;
}
return 0;
@@ -342,7 +342,7 @@ int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) {
if (err) {
if (err != EBUSY && err != EAGAIN)
abort();
- return -EBUSY;
+ return UV_EBUSY;
}
return 0;
@@ -369,12 +369,12 @@ int uv_sem_init(uv_sem_t* sem, unsigned int value) {
if (err == KERN_SUCCESS)
return 0;
if (err == KERN_INVALID_ARGUMENT)
- return -EINVAL;
+ return UV_EINVAL;
if (err == KERN_RESOURCE_SHORTAGE)
- return -ENOMEM;
+ return UV_ENOMEM;
abort();
- return -EINVAL; /* Satisfy the compiler. */
+ return UV_EINVAL; /* Satisfy the compiler. */
}
@@ -413,10 +413,10 @@ int uv_sem_trywait(uv_sem_t* sem) {
if (err == KERN_SUCCESS)
return 0;
if (err == KERN_OPERATION_TIMED_OUT)
- return -EAGAIN;
+ return UV_EAGAIN;
abort();
- return -EINVAL; /* Satisfy the compiler. */
+ return UV_EINVAL; /* Satisfy the compiler. */
}
#elif defined(__MVS__)
@@ -433,14 +433,14 @@ int uv_sem_init(uv_sem_t* sem, unsigned int value) {
semid = semget(IPC_PRIVATE, 1, S_IRUSR | S_IWUSR);
if (semid == -1)
- return -errno;
+ return UV__ERR(errno);
arg.val = value;
if (-1 == semctl(semid, 0, SETVAL, arg)) {
err = errno;
if (-1 == semctl(*sem, 0, IPC_RMID))
abort();
- return -err;
+ return UV__ERR(err);
}
*sem = semid;
@@ -493,7 +493,7 @@ int uv_sem_trywait(uv_sem_t* sem) {
if (op_status) {
if (errno == EAGAIN)
- return -EAGAIN;
+ return UV_EAGAIN;
abort();
}
@@ -504,7 +504,7 @@ int uv_sem_trywait(uv_sem_t* sem) {
int uv_sem_init(uv_sem_t* sem, unsigned int value) {
if (sem_init(sem, 0, value))
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -542,7 +542,7 @@ int uv_sem_trywait(uv_sem_t* sem) {
if (r) {
if (errno == EAGAIN)
- return -EAGAIN;
+ return UV_EAGAIN;
abort();
}
@@ -555,7 +555,7 @@ int uv_sem_trywait(uv_sem_t* sem) {
#if defined(__APPLE__) && defined(__MACH__) || defined(__MVS__)
int uv_cond_init(uv_cond_t* cond) {
- return -pthread_cond_init(cond, NULL);
+ return UV__ERR(pthread_cond_init(cond, NULL));
}
#else /* !(defined(__APPLE__) && defined(__MACH__)) */
@@ -566,7 +566,7 @@ int uv_cond_init(uv_cond_t* cond) {
err = pthread_condattr_init(&attr);
if (err)
- return -err;
+ return UV__ERR(err);
#if !(defined(__ANDROID_API__) && __ANDROID_API__ < 21)
err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
@@ -588,7 +588,7 @@ int uv_cond_init(uv_cond_t* cond) {
pthread_cond_destroy(cond);
error2:
pthread_condattr_destroy(&attr);
- return -err;
+ return UV__ERR(err);
}
#endif /* defined(__APPLE__) && defined(__MACH__) */
@@ -646,13 +646,22 @@ void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) {
int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) {
int r;
struct timespec ts;
+#if defined(__MVS__)
+ struct timeval tv;
+#endif
#if defined(__APPLE__) && defined(__MACH__)
ts.tv_sec = timeout / NANOSEC;
ts.tv_nsec = timeout % NANOSEC;
r = pthread_cond_timedwait_relative_np(cond, mutex, &ts);
+#else
+#if defined(__MVS__)
+ if (gettimeofday(&tv, NULL))
+ abort();
+ timeout += tv.tv_sec * NANOSEC + tv.tv_usec * 1e3;
#else
timeout += uv__hrtime(UV_CLOCK_PRECISE);
+#endif
ts.tv_sec = timeout / NANOSEC;
ts.tv_nsec = timeout % NANOSEC;
#if defined(__ANDROID_API__) && __ANDROID_API__ < 21
@@ -672,15 +681,15 @@ int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) {
return 0;
if (r == ETIMEDOUT)
- return -ETIMEDOUT;
+ return UV_ETIMEDOUT;
abort();
- return -EINVAL; /* Satisfy the compiler. */
+ return UV_EINVAL; /* Satisfy the compiler. */
}
int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) {
- return -pthread_barrier_init(barrier, NULL, count);
+ return UV__ERR(pthread_barrier_init(barrier, NULL, count));
}
@@ -699,7 +708,7 @@ int uv_barrier_wait(uv_barrier_t* barrier) {
int uv_key_create(uv_key_t* key) {
- return -pthread_key_create(key, NULL);
+ return UV__ERR(pthread_key_create(key, NULL));
}
diff --git a/deps/uv/src/unix/timer.c b/deps/uv/src/unix/timer.c
index f46bdf4bf52e61..54dabfe7df9e27 100644
--- a/deps/uv/src/unix/timer.c
+++ b/deps/uv/src/unix/timer.c
@@ -66,7 +66,7 @@ int uv_timer_start(uv_timer_t* handle,
uint64_t clamped_timeout;
if (cb == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (uv__is_active(handle))
uv_timer_stop(handle);
@@ -105,7 +105,7 @@ int uv_timer_stop(uv_timer_t* handle) {
int uv_timer_again(uv_timer_t* handle) {
if (handle->timer_cb == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (handle->repeat) {
uv_timer_stop(handle);
diff --git a/deps/uv/src/unix/tty.c b/deps/uv/src/unix/tty.c
index 357f9748f65bf1..f22b3b80de061f 100644
--- a/deps/uv/src/unix/tty.c
+++ b/deps/uv/src/unix/tty.c
@@ -106,7 +106,7 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
*/
type = uv_guess_handle(fd);
if (type == UV_FILE || type == UV_UNKNOWN_HANDLE)
- return -EINVAL;
+ return UV_EINVAL;
flags = 0;
newfd = -1;
@@ -142,7 +142,7 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
newfd = r;
r = uv__dup2_cloexec(newfd, fd);
- if (r < 0 && r != -EINVAL) {
+ if (r < 0 && r != UV_EINVAL) {
/* EINVAL means newfd == fd which could conceivably happen if another
* thread called close(fd) between our calls to isatty() and open().
* That's a rather unlikely event but let's handle it anyway.
@@ -163,7 +163,7 @@ int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
if (saved_flags == -1) {
if (newfd != -1)
uv__close(newfd);
- return -errno;
+ return UV__ERR(errno);
}
#endif
@@ -234,7 +234,7 @@ int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) {
fd = uv__stream_fd(tty);
if (tty->mode == UV_TTY_MODE_NORMAL && mode != UV_TTY_MODE_NORMAL) {
if (tcgetattr(fd, &tty->orig_termios))
- return -errno;
+ return UV__ERR(errno);
/* This is used for uv_tty_reset_mode() */
uv_spinlock_lock(&termios_spinlock);
@@ -264,7 +264,7 @@ int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) {
/* Apply changes after draining */
if (tcsetattr(fd, TCSADRAIN, &tmp))
- return -errno;
+ return UV__ERR(errno);
tty->mode = mode;
return 0;
@@ -280,7 +280,7 @@ int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) {
while (err == -1 && errno == EINTR);
if (err == -1)
- return -errno;
+ return UV__ERR(errno);
*width = ws.ws_col;
*height = ws.ws_row;
@@ -358,12 +358,12 @@ int uv_tty_reset_mode(void) {
saved_errno = errno;
if (!uv_spinlock_trylock(&termios_spinlock))
- return -EBUSY; /* In uv_tty_set_mode(). */
+ return UV_EBUSY; /* In uv_tty_set_mode(). */
err = 0;
if (orig_termios_fd != -1)
if (tcsetattr(orig_termios_fd, TCSANOW, &orig_termios))
- err = -errno;
+ err = UV__ERR(errno);
uv_spinlock_unlock(&termios_spinlock);
errno = saved_errno;
diff --git a/deps/uv/src/unix/udp.c b/deps/uv/src/unix/udp.c
index a475bf5741634d..74d613b6843b7d 100644
--- a/deps/uv/src/unix/udp.c
+++ b/deps/uv/src/unix/udp.c
@@ -72,7 +72,7 @@ void uv__udp_finish_close(uv_udp_t* handle) {
QUEUE_REMOVE(q);
req = QUEUE_DATA(q, uv_udp_send_t, queue);
- req->status = -ECANCELED;
+ req->status = UV_ECANCELED;
QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
}
@@ -189,7 +189,7 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
if (errno == EAGAIN || errno == EWOULDBLOCK)
handle->recv_cb(handle, 0, &buf, NULL, 0);
else
- handle->recv_cb(handle, -errno, &buf, NULL, 0);
+ handle->recv_cb(handle, UV__ERR(errno), &buf, NULL, 0);
}
else {
const struct sockaddr *addr;
@@ -242,7 +242,7 @@ static void uv__udp_sendmsg(uv_udp_t* handle) {
break;
}
- req->status = (size == -1 ? -errno : size);
+ req->status = (size == -1 ? UV__ERR(errno) : size);
/* Sending a datagram is an atomic operation: either all data
* is written or nothing is (and EMSGSIZE is raised). That is
@@ -270,11 +270,11 @@ static int uv__set_reuse(int fd) {
#if defined(SO_REUSEPORT) && !defined(__linux__)
yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)))
- return -errno;
+ return UV__ERR(errno);
#else
yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
- return -errno;
+ return UV__ERR(errno);
#endif
return 0;
@@ -291,11 +291,11 @@ int uv__udp_bind(uv_udp_t* handle,
/* Check for bad flags. */
if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR))
- return -EINVAL;
+ return UV_EINVAL;
/* Cannot set IPv6-only mode on non-IPv6 socket. */
if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6)
- return -EINVAL;
+ return UV_EINVAL;
fd = handle->io_watcher.fd;
if (fd == -1) {
@@ -316,21 +316,21 @@ int uv__udp_bind(uv_udp_t* handle,
#ifdef IPV6_V6ONLY
yes = 1;
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
- err = -errno;
+ err = UV__ERR(errno);
return err;
}
#else
- err = -ENOTSUP;
+ err = UV_ENOTSUP;
return err;
#endif
}
if (bind(fd, addr, addrlen)) {
- err = -errno;
+ err = UV__ERR(errno);
if (errno == EAFNOSUPPORT)
/* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a
* socket created with AF_INET to an AF_INET6 address or vice versa. */
- err = -EINVAL;
+ err = UV_EINVAL;
return err;
}
@@ -418,7 +418,7 @@ int uv__udp_send(uv_udp_send_t* req,
if (req->bufs == NULL) {
uv__req_unregister(handle->loop, req);
- return -ENOMEM;
+ return UV_ENOMEM;
}
memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0]));
@@ -457,7 +457,7 @@ int uv__udp_try_send(uv_udp_t* handle,
/* already sending a message */
if (handle->send_queue_count != 0)
- return -EAGAIN;
+ return UV_EAGAIN;
err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
if (err)
@@ -475,9 +475,9 @@ int uv__udp_try_send(uv_udp_t* handle,
if (size == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
- return -EAGAIN;
+ return UV_EAGAIN;
else
- return -errno;
+ return UV__ERR(errno);
}
return size;
@@ -512,7 +512,7 @@ static int uv__udp_set_membership4(uv_udp_t* handle,
optname = IP_DROP_MEMBERSHIP;
break;
default:
- return -EINVAL;
+ return UV_EINVAL;
}
if (setsockopt(handle->io_watcher.fd,
@@ -522,9 +522,9 @@ static int uv__udp_set_membership4(uv_udp_t* handle,
sizeof(mreq))) {
#if defined(__MVS__)
if (errno == ENXIO)
- return -ENODEV;
+ return UV_ENODEV;
#endif
- return -errno;
+ return UV__ERR(errno);
}
return 0;
@@ -543,7 +543,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
if (interface_addr) {
if (uv_ip6_addr(interface_addr, 0, &addr6))
- return -EINVAL;
+ return UV_EINVAL;
mreq.ipv6mr_interface = addr6.sin6_scope_id;
} else {
mreq.ipv6mr_interface = 0;
@@ -559,7 +559,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
optname = IPV6_DROP_MEMBERSHIP;
break;
default:
- return -EINVAL;
+ return UV_EINVAL;
}
if (setsockopt(handle->io_watcher.fd,
@@ -569,9 +569,9 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
sizeof(mreq))) {
#if defined(__MVS__)
if (errno == ENXIO)
- return -ENODEV;
+ return UV_ENODEV;
#endif
- return -errno;
+ return UV__ERR(errno);
}
return 0;
@@ -586,10 +586,10 @@ int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
/* Use the lower 8 bits for the domain */
domain = flags & 0xFF;
if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
- return -EINVAL;
+ return UV_EINVAL;
if (flags & ~0xFF)
- return -EINVAL;
+ return UV_EINVAL;
if (domain != AF_UNSPEC) {
err = uv__socket(domain, SOCK_DGRAM, 0);
@@ -622,7 +622,7 @@ int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
/* Check for already active socket. */
if (handle->io_watcher.fd != -1)
- return -EBUSY;
+ return UV_EBUSY;
err = uv__nonblock(sock, 1);
if (err)
@@ -656,7 +656,7 @@ int uv_udp_set_membership(uv_udp_t* handle,
return err;
return uv__udp_set_membership6(handle, &addr6, interface_addr, membership);
} else {
- return -EINVAL;
+ return UV_EINVAL;
}
}
@@ -680,7 +680,7 @@ static int uv__setsockopt(uv_udp_t* handle,
val,
size);
if (r)
- return -errno;
+ return UV__ERR(errno);
return 0;
}
@@ -698,7 +698,7 @@ static int uv__setsockopt_maybe_char(uv_udp_t* handle,
#endif
if (val < 0 || val > 255)
- return -EINVAL;
+ return UV_EINVAL;
return uv__setsockopt(handle, option4, option6, &arg, sizeof(arg));
}
@@ -710,7 +710,7 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
SO_BROADCAST,
&on,
sizeof(on))) {
- return -errno;
+ return UV__ERR(errno);
}
return 0;
@@ -719,11 +719,11 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
int uv_udp_set_ttl(uv_udp_t* handle, int ttl) {
if (ttl < 1 || ttl > 255)
- return -EINVAL;
+ return UV_EINVAL;
#if defined(__MVS__)
if (!(handle->flags & UV_HANDLE_IPV6))
- return -ENOTSUP; /* zOS does not support setting ttl for IPv4 */
+ return UV_ENOTSUP; /* zOS does not support setting ttl for IPv4 */
#endif
/*
@@ -817,7 +817,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
} else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) {
/* nothing, address was parsed */
} else {
- return -EINVAL;
+ return UV_EINVAL;
}
if (addr_st.ss_family == AF_INET) {
@@ -826,7 +826,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
IP_MULTICAST_IF,
(void*) &addr4->sin_addr,
sizeof(addr4->sin_addr)) == -1) {
- return -errno;
+ return UV__ERR(errno);
}
} else if (addr_st.ss_family == AF_INET6) {
if (setsockopt(handle->io_watcher.fd,
@@ -834,7 +834,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
IPV6_MULTICAST_IF,
&addr6->sin6_scope_id,
sizeof(addr6->sin6_scope_id)) == -1) {
- return -errno;
+ return UV__ERR(errno);
}
} else {
assert(0 && "unexpected address family");
@@ -851,13 +851,13 @@ int uv_udp_getsockname(const uv_udp_t* handle,
socklen_t socklen;
if (handle->io_watcher.fd == -1)
- return -EINVAL; /* FIXME(bnoordhuis) -EBADF */
+ return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t) *namelen;
if (getsockname(handle->io_watcher.fd, name, &socklen))
- return -errno;
+ return UV__ERR(errno);
*namelen = (int) socklen;
return 0;
@@ -870,10 +870,10 @@ int uv__udp_recv_start(uv_udp_t* handle,
int err;
if (alloc_cb == NULL || recv_cb == NULL)
- return -EINVAL;
+ return UV_EINVAL;
if (uv__io_active(&handle->io_watcher, POLLIN))
- return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */
+ return UV_EALREADY; /* FIXME(bnoordhuis) Should be UV_EBUSY. */
err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0);
if (err)
diff --git a/deps/uv/src/uv-common.h b/deps/uv/src/uv-common.h
index 781a8559dc8428..d4fa22aaef6add 100644
--- a/deps/uv/src/uv-common.h
+++ b/deps/uv/src/uv-common.h
@@ -41,6 +41,12 @@
#include "tree.h"
#include "queue.h"
+#if EDOM > 0
+# define UV__ERR(x) (-(x))
+#else
+# define UV__ERR(x) (x)
+#endif
+
#if !defined(snprintf) && defined(_MSC_VER) && _MSC_VER < 1900
extern int snprintf(char*, size_t, const char*, ...);
#endif
diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c
index 097b00e08d50d5..6e0bdc7bb20e66 100644
--- a/deps/uv/src/win/fs.c
+++ b/deps/uv/src/win/fs.c
@@ -245,6 +245,7 @@ INLINE static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req,
req->ptr = NULL;
req->path = NULL;
req->cb = cb;
+ req->fs.info.bufs = NULL;
memset(&req->fs, 0, sizeof(req->fs));
}
diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c
index cc06d9e22abcb6..7523522217392e 100644
--- a/deps/uv/src/win/process.c
+++ b/deps/uv/src/win/process.c
@@ -1061,11 +1061,16 @@ int uv_spawn(uv_loop_t* loop,
process_flags = CREATE_UNICODE_ENVIRONMENT;
if (options->flags & UV_PROCESS_WINDOWS_HIDE) {
+ /* Avoid creating console window if stdio is not inherited. */
+ for (i = 0; i < options->stdio_count; i++) {
+ if (options->stdio[i].flags & UV_INHERIT_FD)
+ break;
+ if (i == options->stdio_count - 1)
+ process_flags |= CREATE_NO_WINDOW;
+ }
+
/* Use SW_HIDE to avoid any potential process window. */
startup.wShowWindow = SW_HIDE;
-
- /* Hide console windows. */
- process_flags |= CREATE_NO_WINDOW;
} else {
startup.wShowWindow = SW_SHOWDEFAULT;
}
diff --git a/deps/uv/src/win/winsock.c b/deps/uv/src/win/winsock.c
index 7cfa90f8af5127..84188954d815f1 100644
--- a/deps/uv/src/win/winsock.c
+++ b/deps/uv/src/win/winsock.c
@@ -580,8 +580,10 @@ int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr,
memcpy(dest6, addr, sizeof(*dest6));
if (memcmp(&dest6->sin6_addr,
&uv_addr_ip6_any_.sin6_addr,
- sizeof(uv_addr_ip6_any_.sin6_addr)) == 0)
- dest6->sin6_addr = (struct in6_addr) IN6ADDR_LOOPBACK_INIT;
+ sizeof(uv_addr_ip6_any_.sin6_addr)) == 0) {
+ struct in6_addr init_sin6_addr = IN6ADDR_LOOPBACK_INIT;
+ dest6->sin6_addr = init_sin6_addr;
+ }
return 0;
default:
return UV_EINVAL;
diff --git a/deps/uv/test/test-condvar.c b/deps/uv/test/test-condvar.c
index 83b28494adbb3f..d956efef3c5a00 100644
--- a/deps/uv/test/test-condvar.c
+++ b/deps/uv/test/test-condvar.c
@@ -34,7 +34,7 @@ typedef struct worker_config {
volatile int posted_1;
volatile int posted_2;
void (*signal_cond)(struct worker_config* c, volatile int* flag);
- void (*wait_cond)(struct worker_config* c, const volatile int* flag);
+ int (*wait_cond)(struct worker_config* c, const volatile int* flag);
} worker_config;
@@ -44,6 +44,9 @@ static void worker(void* arg) {
c->wait_cond(c, &c->posted_2);
}
+static void noop_worker(void* arg) {
+ return;
+}
static void condvar_signal(worker_config* c, volatile int* flag) {
if (c->signal_delay)
@@ -60,7 +63,7 @@ static void condvar_signal(worker_config* c, volatile int* flag) {
}
-static void condvar_wait(worker_config* c, const volatile int* flag) {
+static int condvar_wait(worker_config* c, const volatile int* flag) {
uv_mutex_lock(&c->mutex);
if (c->wait_delay)
uv_sleep(c->wait_delay);
@@ -69,6 +72,8 @@ static void condvar_wait(worker_config* c, const volatile int* flag) {
}
ASSERT(*flag == 1);
uv_mutex_unlock(&c->mutex);
+
+ return 0;
}
@@ -85,7 +90,7 @@ TEST_IMPL(condvar_1) {
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- wc.wait_cond(&wc, &wc.posted_1);
+ ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1));
wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
@@ -109,7 +114,7 @@ TEST_IMPL(condvar_2) {
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- wc.wait_cond(&wc, &wc.posted_1);
+ ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1));
wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
@@ -120,20 +125,26 @@ TEST_IMPL(condvar_2) {
}
-static void condvar_timedwait(worker_config* c, const volatile int* flag) {
+static int condvar_timedwait(worker_config* c, const volatile int* flag) {
int r;
+ r = 0;
+
uv_mutex_lock(&c->mutex);
if (c->wait_delay)
uv_sleep(c->wait_delay);
while (*flag == 0) {
r = uv_cond_timedwait(&c->cond, &c->mutex, (uint64_t)(150 * 1e6));
- ASSERT(r == 0);
+ ASSERT(r == 0 || r == UV_ETIMEDOUT);
+ if (r == UV_ETIMEDOUT)
+ break;
}
uv_mutex_unlock(&c->mutex);
-}
+ return r;
+}
+/* Test that uv_cond_timedwait will return early when cond is signaled. */
TEST_IMPL(condvar_3) {
uv_thread_t thread;
worker_config wc;
@@ -147,7 +158,7 @@ TEST_IMPL(condvar_3) {
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- wc.wait_cond(&wc, &wc.posted_1);
+ ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1));
wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
@@ -205,3 +216,30 @@ TEST_IMPL(condvar_5) {
return 0;
}
+
+/* Test that uv_cond_timedwait will time out when cond is not signaled. */
+TEST_IMPL(condvar_6) {
+ uv_thread_t thread;
+ worker_config wc;
+ int r;
+
+ memset(&wc, 0, sizeof(wc));
+ wc.signal_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_timedwait;
+
+ ASSERT(0 == uv_cond_init(&wc.cond));
+ ASSERT(0 == uv_mutex_init(&wc.mutex));
+ ASSERT(0 == uv_thread_create(&thread, noop_worker, &wc));
+
+ /* This can only return having timed out, because otherwise we
+ * loop forever in condvar_timedwait. */
+ r = wc.wait_cond(&wc, &wc.posted_1);
+ ASSERT(r == UV_ETIMEDOUT);
+
+ ASSERT(0 == uv_thread_join(&thread));
+ uv_mutex_destroy(&wc.mutex);
+ uv_cond_destroy(&wc.cond);
+
+ return 0;
+}
diff --git a/deps/uv/test/test-fork.c b/deps/uv/test/test-fork.c
index 924c65b2141134..39b59c8f20ebb4 100644
--- a/deps/uv/test/test-fork.c
+++ b/deps/uv/test/test-fork.c
@@ -335,7 +335,7 @@ TEST_IMPL(fork_signal_to_child_closed) {
/* Note that we're deliberately not running the loop
* in the child, and also not closing the loop's handles,
* so the child default loop can't be cleanly closed.
- * We need te explicitly exit to avoid an automatic failure
+ * We need to explicitly exit to avoid an automatic failure
* in that case.
*/
exit(0);
diff --git a/deps/uv/test/test-fs-copyfile.c b/deps/uv/test/test-fs-copyfile.c
index 460c1dc6ae0b9f..4b1fdc5e798280 100644
--- a/deps/uv/test/test-fs-copyfile.c
+++ b/deps/uv/test/test-fs-copyfile.c
@@ -36,6 +36,10 @@ static const char dst[] = "test_file_dst";
static int result_check_count;
+static void fail_cb(uv_fs_t* req) {
+ FATAL("fail_cb should not have been called");
+}
+
static void handle_result(uv_fs_t* req) {
uv_fs_t stat_req;
uint64_t size;
@@ -158,7 +162,12 @@ TEST_IMPL(fs_copyfile) {
ASSERT(result_check_count == 5);
uv_run(loop, UV_RUN_DEFAULT);
ASSERT(result_check_count == 6);
- unlink(dst); /* Cleanup */
+ /* If the flags are invalid, the loop should not be kept open */
+ unlink(dst);
+ r = uv_fs_copyfile(loop, &req, fixture, dst, -1, fail_cb);
+ ASSERT(r == UV_EINVAL);
+ uv_run(loop, UV_RUN_DEFAULT);
+ unlink(dst); /* Cleanup */
return 0;
}
diff --git a/deps/uv/test/test-fs-event.c b/deps/uv/test/test-fs-event.c
index dc47b3a62d2399..39d73300dc2b61 100644
--- a/deps/uv/test/test-fs-event.c
+++ b/deps/uv/test/test-fs-event.c
@@ -199,7 +199,7 @@ static void fs_event_cb_dir_multi_file(uv_fs_event_t* handle,
fs_event_cb_called++;
ASSERT(handle == &fs_event);
ASSERT(status == 0);
- ASSERT(events == UV_CHANGE || UV_RENAME);
+ ASSERT(events == UV_CHANGE || events == UV_RENAME);
#if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
ASSERT(strncmp(filename, file_prefix, sizeof(file_prefix) - 1) == 0);
#else
@@ -283,7 +283,7 @@ static void fs_event_cb_dir_multi_file_in_subdir(uv_fs_event_t* handle,
fs_event_cb_called++;
ASSERT(handle == &fs_event);
ASSERT(status == 0);
- ASSERT(events == UV_CHANGE || UV_RENAME);
+ ASSERT(events == UV_CHANGE || events == UV_RENAME);
#if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
ASSERT(strncmp(filename,
file_prefix_in_subdir,
diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c
index 7c481f0711978f..3318b86649de50 100644
--- a/deps/uv/test/test-fs.c
+++ b/deps/uv/test/test-fs.c
@@ -319,6 +319,9 @@ static void ftruncate_cb(uv_fs_t* req) {
ASSERT(r == 0);
}
+static void fail_cb(uv_fs_t* req) {
+ FATAL("fail_cb should not have been called");
+}
static void read_cb(uv_fs_t* req) {
int r;
@@ -2884,7 +2887,19 @@ TEST_IMPL(fs_read_write_null_arguments) {
uv_fs_req_cleanup(&read_req);
r = uv_fs_write(NULL, &write_req, 0, NULL, 0, -1, NULL);
+ /* Validate some memory management on failed input validation before sending
+ fs work to the thread pool. */
ASSERT(r == UV_EINVAL);
+ ASSERT(write_req.path == NULL);
+ ASSERT(write_req.ptr == NULL);
+#ifdef _WIN32
+ ASSERT(write_req.file.pathw == NULL);
+ ASSERT(write_req.fs.info.new_pathw == NULL);
+ ASSERT(write_req.fs.info.bufs == NULL);
+#else
+ ASSERT(write_req.new_path == NULL);
+ ASSERT(write_req.bufs == NULL);
+#endif
uv_fs_req_cleanup(&write_req);
iov = uv_buf_init(NULL, 0);
@@ -2897,6 +2912,31 @@ TEST_IMPL(fs_read_write_null_arguments) {
ASSERT(r == UV_EINVAL);
uv_fs_req_cleanup(&write_req);
+ /* If the arguments are invalid, the loop should not be kept open */
+ loop = uv_default_loop();
+
+ r = uv_fs_read(loop, &read_req, 0, NULL, 0, -1, fail_cb);
+ ASSERT(r == UV_EINVAL);
+ uv_run(loop, UV_RUN_DEFAULT);
+ uv_fs_req_cleanup(&read_req);
+
+ r = uv_fs_write(loop, &write_req, 0, NULL, 0, -1, fail_cb);
+ ASSERT(r == UV_EINVAL);
+ uv_run(loop, UV_RUN_DEFAULT);
+ uv_fs_req_cleanup(&write_req);
+
+ iov = uv_buf_init(NULL, 0);
+ r = uv_fs_read(loop, &read_req, 0, &iov, 0, -1, fail_cb);
+ ASSERT(r == UV_EINVAL);
+ uv_run(loop, UV_RUN_DEFAULT);
+ uv_fs_req_cleanup(&read_req);
+
+ iov = uv_buf_init(NULL, 0);
+ r = uv_fs_write(loop, &write_req, 0, &iov, 0, -1, fail_cb);
+ ASSERT(r == UV_EINVAL);
+ uv_run(loop, UV_RUN_DEFAULT);
+ uv_fs_req_cleanup(&write_req);
+
return 0;
}
@@ -3084,7 +3124,7 @@ TEST_IMPL(fs_exclusive_sharing_mode) {
unlink("test_file");
ASSERT(UV_FS_O_EXLOCK > 0);
-
+
r = uv_fs_open(NULL,
&open_req1,
"test_file",
diff --git a/deps/uv/test/test-ipc-send-recv.c b/deps/uv/test/test-ipc-send-recv.c
index 160c235078b939..917744cbaed978 100644
--- a/deps/uv/test/test-ipc-send-recv.c
+++ b/deps/uv/test/test-ipc-send-recv.c
@@ -304,7 +304,7 @@ static void read_cb(uv_stream_t* handle,
union handles* recv;
uv_write_t* write_req;
- if (nread == UV__EOF || nread == UV__ECONNABORTED) {
+ if (nread == UV_EOF || nread == UV_ECONNABORTED) {
return;
}
diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h
index 5a50ec6713f03f..ff0a31d16bb940 100644
--- a/deps/uv/test/test-list.h
+++ b/deps/uv/test/test-list.h
@@ -42,6 +42,7 @@ TEST_DECLARE (condvar_2)
TEST_DECLARE (condvar_3)
TEST_DECLARE (condvar_4)
TEST_DECLARE (condvar_5)
+TEST_DECLARE (condvar_6)
TEST_DECLARE (semaphore_1)
TEST_DECLARE (semaphore_2)
TEST_DECLARE (semaphore_3)
@@ -445,6 +446,7 @@ TASK_LIST_START
TEST_ENTRY (condvar_3)
TEST_ENTRY (condvar_4)
TEST_ENTRY (condvar_5)
+ TEST_ENTRY (condvar_6)
TEST_ENTRY (semaphore_1)
TEST_ENTRY (semaphore_2)
TEST_ENTRY (semaphore_3)
diff --git a/deps/uv/test/test.gyp b/deps/uv/test/test.gyp
new file mode 100644
index 00000000000000..480e5a26c4176d
--- /dev/null
+++ b/deps/uv/test/test.gyp
@@ -0,0 +1,279 @@
+{
+ 'targets': [
+ {
+ 'target_name': 'run-tests',
+ 'type': 'executable',
+ 'dependencies': [ '../uv.gyp:libuv' ],
+ 'sources': [
+ 'blackhole-server.c',
+ 'echo-server.c',
+ 'run-tests.c',
+ 'runner.c',
+ 'runner.h',
+ 'test-get-loadavg.c',
+ 'task.h',
+ 'test-active.c',
+ 'test-async.c',
+ 'test-async-null-cb.c',
+ 'test-callback-stack.c',
+ 'test-callback-order.c',
+ 'test-close-fd.c',
+ 'test-close-order.c',
+ 'test-connect-unspecified.c',
+ 'test-connection-fail.c',
+ 'test-cwd-and-chdir.c',
+ 'test-default-loop-close.c',
+ 'test-delayed-accept.c',
+ 'test-eintr-handling.c',
+ 'test-error.c',
+ 'test-embed.c',
+ 'test-emfile.c',
+ 'test-env-vars.c',
+ 'test-fail-always.c',
+ 'test-fork.c',
+ 'test-fs.c',
+ 'test-fs-copyfile.c',
+ 'test-fs-event.c',
+ 'test-getters-setters.c',
+ 'test-get-currentexe.c',
+ 'test-get-memory.c',
+ 'test-get-passwd.c',
+ 'test-getaddrinfo.c',
+ 'test-gethostname.c',
+ 'test-getnameinfo.c',
+ 'test-getsockname.c',
+ 'test-handle-fileno.c',
+ 'test-homedir.c',
+ 'test-hrtime.c',
+ 'test-idle.c',
+ 'test-ip6-addr.c',
+ 'test-ipc.c',
+ 'test-ipc-send-recv.c',
+ 'test-list.h',
+ 'test-loop-handles.c',
+ 'test-loop-alive.c',
+ 'test-loop-close.c',
+ 'test-loop-stop.c',
+ 'test-loop-time.c',
+ 'test-loop-configure.c',
+ 'test-walk-handles.c',
+ 'test-watcher-cross-stop.c',
+ 'test-multiple-listen.c',
+ 'test-osx-select.c',
+ 'test-pass-always.c',
+ 'test-ping-pong.c',
+ 'test-pipe-bind-error.c',
+ 'test-pipe-connect-error.c',
+ 'test-pipe-connect-multiple.c',
+ 'test-pipe-connect-prepare.c',
+ 'test-pipe-getsockname.c',
+ 'test-pipe-pending-instances.c',
+ 'test-pipe-sendmsg.c',
+ 'test-pipe-server-close.c',
+ 'test-pipe-close-stdout-read-stdin.c',
+ 'test-pipe-set-non-blocking.c',
+ 'test-pipe-set-fchmod.c',
+ 'test-platform-output.c',
+ 'test-poll.c',
+ 'test-poll-close.c',
+ 'test-poll-close-doesnt-corrupt-stack.c',
+ 'test-poll-closesocket.c',
+ 'test-poll-oob.c',
+ 'test-process-title.c',
+ 'test-process-title-threadsafe.c',
+ 'test-queue-foreach-delete.c',
+ 'test-ref.c',
+ 'test-run-nowait.c',
+ 'test-run-once.c',
+ 'test-semaphore.c',
+ 'test-shutdown-close.c',
+ 'test-shutdown-eof.c',
+ 'test-shutdown-twice.c',
+ 'test-signal.c',
+ 'test-signal-multiple-loops.c',
+ 'test-socket-buffer-size.c',
+ 'test-spawn.c',
+ 'test-fs-poll.c',
+ 'test-stdio-over-pipes.c',
+ 'test-tcp-alloc-cb-fail.c',
+ 'test-tcp-bind-error.c',
+ 'test-tcp-bind6-error.c',
+ 'test-tcp-close.c',
+ 'test-tcp-close-accept.c',
+ 'test-tcp-close-while-connecting.c',
+ 'test-tcp-create-socket-early.c',
+ 'test-tcp-connect-error-after-write.c',
+ 'test-tcp-shutdown-after-write.c',
+ 'test-tcp-flags.c',
+ 'test-tcp-connect-error.c',
+ 'test-tcp-connect-timeout.c',
+ 'test-tcp-connect6-error.c',
+ 'test-tcp-open.c',
+ 'test-tcp-write-to-half-open-connection.c',
+ 'test-tcp-write-after-connect.c',
+ 'test-tcp-writealot.c',
+ 'test-tcp-write-fail.c',
+ 'test-tcp-try-write.c',
+ 'test-tcp-unexpected-read.c',
+ 'test-tcp-oob.c',
+ 'test-tcp-read-stop.c',
+ 'test-tcp-write-queue-order.c',
+ 'test-threadpool.c',
+ 'test-threadpool-cancel.c',
+ 'test-thread-equal.c',
+ 'test-tmpdir.c',
+ 'test-mutexes.c',
+ 'test-thread.c',
+ 'test-barrier.c',
+ 'test-condvar.c',
+ 'test-timer-again.c',
+ 'test-timer-from-check.c',
+ 'test-timer.c',
+ 'test-tty.c',
+ 'test-udp-alloc-cb-fail.c',
+ 'test-udp-bind.c',
+ 'test-udp-create-socket-early.c',
+ 'test-udp-dgram-too-big.c',
+ 'test-udp-ipv6.c',
+ 'test-udp-open.c',
+ 'test-udp-options.c',
+ 'test-udp-send-and-recv.c',
+ 'test-udp-send-hang-loop.c',
+ 'test-udp-send-immediate.c',
+ 'test-udp-send-unreachable.c',
+ 'test-udp-multicast-join.c',
+ 'test-udp-multicast-join6.c',
+ 'test-dlerror.c',
+ 'test-udp-multicast-ttl.c',
+ 'test-ip4-addr.c',
+ 'test-ip6-addr.c',
+ 'test-udp-multicast-interface.c',
+ 'test-udp-multicast-interface6.c',
+ 'test-udp-try-send.c',
+ ],
+ 'conditions': [
+ [ 'OS=="win"', {
+ 'sources': [
+ 'runner-win.c',
+ 'runner-win.h',
+ '../src/win/snprintf.c',
+ ],
+ 'libraries': [ '-lws2_32' ]
+ }, { # POSIX
+ 'sources': [
+ 'runner-unix.c',
+ 'runner-unix.h',
+ ],
+ 'conditions': [
+ [ 'OS != "zos"', {
+ 'defines': [ '_GNU_SOURCE' ],
+ 'cflags': [ '-Wno-long-long' ],
+ 'xcode_settings': {
+ 'WARNING_CFLAGS': [ '-Wno-long-long' ]
+ }
+ }],
+ ]},
+ ],
+ [ 'OS in "mac dragonflybsd freebsd linux netbsd openbsd".split()', {
+ 'link_settings': {
+ 'libraries': [ '-lutil' ],
+ },
+ }],
+ [ 'OS=="solaris"', { # make test-fs.c compile, needs _POSIX_C_SOURCE
+ 'defines': [
+ '__EXTENSIONS__',
+ '_XOPEN_SOURCE=500',
+ ],
+ }],
+ [ 'OS=="aix"', { # make test-fs.c compile, needs _POSIX_C_SOURCE
+ 'defines': [
+ '_ALL_SOURCE',
+ '_XOPEN_SOURCE=500',
+ ],
+ }],
+ [ 'OS == "zos"', {
+ 'cflags': [ '-qxplink' ],
+ 'ldflags': [ '-qxplink' ],
+ }],
+ ['uv_library=="shared_library"', {
+ 'defines': [ 'USING_UV_SHARED=1' ],
+ 'conditions': [
+ [ 'OS == "zos"', {
+ 'cflags': [ '-Wc,DLL' ],
+ }],
+ ],
+ }],
+ ],
+ 'msvs-settings': {
+ 'VCLinkerTool': {
+ 'SubSystem': 1, # /subsystem:console
+ },
+ },
+ },
+
+ {
+ 'target_name': 'run-benchmarks',
+ 'type': 'executable',
+ 'dependencies': [ '../uv.gyp:libuv' ],
+ 'sources': [
+ 'benchmark-async.c',
+ 'benchmark-async-pummel.c',
+ 'benchmark-fs-stat.c',
+ 'benchmark-getaddrinfo.c',
+ 'benchmark-list.h',
+ 'benchmark-loop-count.c',
+ 'benchmark-million-async.c',
+ 'benchmark-million-timers.c',
+ 'benchmark-multi-accept.c',
+ 'benchmark-ping-pongs.c',
+ 'benchmark-pound.c',
+ 'benchmark-pump.c',
+ 'benchmark-sizes.c',
+ 'benchmark-spawn.c',
+ 'benchmark-thread.c',
+ 'benchmark-tcp-write-batch.c',
+ 'benchmark-udp-pummel.c',
+ 'dns-server.c',
+ 'echo-server.c',
+ 'blackhole-server.c',
+ 'run-benchmarks.c',
+ 'runner.c',
+ 'runner.h',
+ 'task.h',
+ ],
+ 'conditions': [
+ [ 'OS=="win"', {
+ 'sources': [
+ 'runner-win.c',
+ 'runner-win.h',
+ '../src/win/snprintf.c',
+ ],
+ 'libraries': [ '-lws2_32' ]
+ }, { # POSIX
+ 'defines': [ '_GNU_SOURCE' ],
+ 'sources': [
+ 'runner-unix.c',
+ 'runner-unix.h',
+ ]
+ }],
+ [ 'OS == "zos"', {
+ 'cflags': [ '-qxplink' ],
+ 'ldflags': [ '-qxplink' ],
+ }],
+ ['uv_library=="shared_library"', {
+ 'defines': [ 'USING_UV_SHARED=1' ],
+ 'conditions': [
+ [ 'OS == "zos"', {
+ 'cflags': [ '-Wc,DLL' ],
+ }],
+ ],
+ }],
+ ],
+ 'msvs-settings': {
+ 'VCLinkerTool': {
+ 'SubSystem': 1, # /subsystem:console
+ },
+ },
+ },
+ ],
+}
diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp
index 46606c5bda868d..a5046b87ea5b3c 100644
--- a/deps/uv/uv.gyp
+++ b/deps/uv/uv.gyp
@@ -1,44 +1,38 @@
{
- 'target_defaults': {
+ 'variables': {
'conditions': [
- ['OS != "win"', {
- 'defines': [
+ ['OS=="win"', {
+ 'shared_unix_defines': [
'_LARGEFILE_SOURCE',
'_FILE_OFFSET_BITS=64',
],
- 'conditions': [
- ['OS=="solaris"', {
- 'cflags': [ '-pthreads' ],
- }],
- ['OS not in "solaris android zos"', {
- 'cflags': [ '-pthread' ],
- }],
- ['OS in "zos"', {
- 'defines': [
- '_UNIX03_THREADS',
- '_UNIX03_SOURCE',
- '_UNIX03_WITHDRAWN',
- '_OPEN_SYS_IF_EXT',
- '_OPEN_SYS_SOCK_IPV6',
- '_OPEN_MSGQ_EXT',
- '_XOPEN_SOURCE_EXTENDED',
- '_ALL_SOURCE',
- '_LARGE_TIME_API',
- '_OPEN_SYS_FILE_EXT',
- '_AE_BIMODAL',
- 'PATH_MAX=255'
- ],
- 'cflags': [ '-qxplink' ],
- 'ldflags': [ '-qxplink' ],
- }]
+ }, {
+ 'shared_unix_defines': [ ],
+ }],
+ ['OS in "mac ios"', {
+ 'shared_mac_defines': [ '_DARWIN_USE_64_BIT_INODE=1' ],
+ }, {
+ 'shared_mac_defines': [ ],
+ }],
+ ['OS=="zos"', {
+ 'shared_zos_defines': [
+ '_UNIX03_THREADS',
+ '_UNIX03_SOURCE',
+ '_UNIX03_WITHDRAWN',
+ '_OPEN_SYS_IF_EXT',
+ '_OPEN_SYS_SOCK_IPV6',
+ '_OPEN_MSGQ_EXT',
+ '_XOPEN_SOURCE_EXTENDED',
+ '_ALL_SOURCE',
+ '_LARGE_TIME_API',
+ '_OPEN_SYS_FILE_EXT',
+ '_AE_BIMODAL',
+ 'PATH_MAX=255'
],
+ }, {
+ 'shared_zos_defines': [ ],
}],
],
- 'xcode_settings': {
- 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
- 'WARNING_CFLAGS': [ '-Wall', '-Wextra', '-Wno-unused-parameter', '-Wstrict-prototypes' ],
- 'OTHER_CFLAGS': [ '-g', '--std=gnu89', '-pedantic' ],
- }
},
'targets': [
@@ -49,18 +43,19 @@
'include',
'src/',
],
+ 'defines': [
+ '<@(shared_mac_defines)',
+ '<@(shared_unix_defines)',
+ '<@(shared_zos_defines)',
+ ],
'direct_dependent_settings': {
+ 'defines': [
+ '<@(shared_mac_defines)',
+ '<@(shared_unix_defines)',
+ '<@(shared_zos_defines)',
+ ],
'include_dirs': [ 'include' ],
'conditions': [
- ['OS != "win"', {
- 'defines': [
- '_LARGEFILE_SOURCE',
- '_FILE_OFFSET_BITS=64',
- ],
- }],
- ['OS in "mac ios"', {
- 'defines': [ '_DARWIN_USE_64_BIT_INODE=1' ],
- }],
['OS == "linux"', {
'defines': [ '_POSIX_C_SOURCE=200112' ],
}],
@@ -83,6 +78,16 @@
'src/uv-common.h',
'src/version.c'
],
+ 'xcode_settings': {
+ 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
+ 'WARNING_CFLAGS': [
+ '-Wall',
+ '-Wextra',
+ '-Wno-unused-parameter',
+ '-Wstrict-prototypes',
+ ],
+ 'OTHER_CFLAGS': [ '-g', '--std=gnu89', '-pedantic' ],
+ },
'conditions': [
[ 'OS=="win"', {
'defines': [
@@ -346,273 +351,5 @@
}],
]
},
-
- {
- 'target_name': 'run-tests',
- 'type': 'executable',
- 'dependencies': [ 'libuv' ],
- 'sources': [
- 'test/blackhole-server.c',
- 'test/echo-server.c',
- 'test/run-tests.c',
- 'test/runner.c',
- 'test/runner.h',
- 'test/test-get-loadavg.c',
- 'test/task.h',
- 'test/test-active.c',
- 'test/test-async.c',
- 'test/test-async-null-cb.c',
- 'test/test-callback-stack.c',
- 'test/test-callback-order.c',
- 'test/test-close-fd.c',
- 'test/test-close-order.c',
- 'test/test-connect-unspecified.c',
- 'test/test-connection-fail.c',
- 'test/test-cwd-and-chdir.c',
- 'test/test-default-loop-close.c',
- 'test/test-delayed-accept.c',
- 'test/test-eintr-handling.c',
- 'test/test-error.c',
- 'test/test-embed.c',
- 'test/test-emfile.c',
- 'test/test-env-vars.c',
- 'test/test-fail-always.c',
- 'test/test-fork.c',
- 'test/test-fs.c',
- 'test/test-fs-copyfile.c',
- 'test/test-fs-event.c',
- 'test/test-getters-setters.c',
- 'test/test-get-currentexe.c',
- 'test/test-get-memory.c',
- 'test/test-get-passwd.c',
- 'test/test-getaddrinfo.c',
- 'test/test-gethostname.c',
- 'test/test-getnameinfo.c',
- 'test/test-getsockname.c',
- 'test/test-handle-fileno.c',
- 'test/test-homedir.c',
- 'test/test-hrtime.c',
- 'test/test-idle.c',
- 'test/test-ip6-addr.c',
- 'test/test-ipc.c',
- 'test/test-ipc-send-recv.c',
- 'test/test-list.h',
- 'test/test-loop-handles.c',
- 'test/test-loop-alive.c',
- 'test/test-loop-close.c',
- 'test/test-loop-stop.c',
- 'test/test-loop-time.c',
- 'test/test-loop-configure.c',
- 'test/test-walk-handles.c',
- 'test/test-watcher-cross-stop.c',
- 'test/test-multiple-listen.c',
- 'test/test-osx-select.c',
- 'test/test-pass-always.c',
- 'test/test-ping-pong.c',
- 'test/test-pipe-bind-error.c',
- 'test/test-pipe-connect-error.c',
- 'test/test-pipe-connect-multiple.c',
- 'test/test-pipe-connect-prepare.c',
- 'test/test-pipe-getsockname.c',
- 'test/test-pipe-pending-instances.c',
- 'test/test-pipe-sendmsg.c',
- 'test/test-pipe-server-close.c',
- 'test/test-pipe-close-stdout-read-stdin.c',
- 'test/test-pipe-set-non-blocking.c',
- 'test/test-pipe-set-fchmod.c',
- 'test/test-platform-output.c',
- 'test/test-poll.c',
- 'test/test-poll-close.c',
- 'test/test-poll-close-doesnt-corrupt-stack.c',
- 'test/test-poll-closesocket.c',
- 'test/test-poll-oob.c',
- 'test/test-process-title.c',
- 'test/test-process-title-threadsafe.c',
- 'test/test-queue-foreach-delete.c',
- 'test/test-ref.c',
- 'test/test-run-nowait.c',
- 'test/test-run-once.c',
- 'test/test-semaphore.c',
- 'test/test-shutdown-close.c',
- 'test/test-shutdown-eof.c',
- 'test/test-shutdown-twice.c',
- 'test/test-signal.c',
- 'test/test-signal-multiple-loops.c',
- 'test/test-socket-buffer-size.c',
- 'test/test-spawn.c',
- 'test/test-fs-poll.c',
- 'test/test-stdio-over-pipes.c',
- 'test/test-tcp-alloc-cb-fail.c',
- 'test/test-tcp-bind-error.c',
- 'test/test-tcp-bind6-error.c',
- 'test/test-tcp-close.c',
- 'test/test-tcp-close-accept.c',
- 'test/test-tcp-close-while-connecting.c',
- 'test/test-tcp-create-socket-early.c',
- 'test/test-tcp-connect-error-after-write.c',
- 'test/test-tcp-shutdown-after-write.c',
- 'test/test-tcp-flags.c',
- 'test/test-tcp-connect-error.c',
- 'test/test-tcp-connect-timeout.c',
- 'test/test-tcp-connect6-error.c',
- 'test/test-tcp-open.c',
- 'test/test-tcp-write-to-half-open-connection.c',
- 'test/test-tcp-write-after-connect.c',
- 'test/test-tcp-writealot.c',
- 'test/test-tcp-write-fail.c',
- 'test/test-tcp-try-write.c',
- 'test/test-tcp-unexpected-read.c',
- 'test/test-tcp-oob.c',
- 'test/test-tcp-read-stop.c',
- 'test/test-tcp-write-queue-order.c',
- 'test/test-threadpool.c',
- 'test/test-threadpool-cancel.c',
- 'test/test-thread-equal.c',
- 'test/test-tmpdir.c',
- 'test/test-mutexes.c',
- 'test/test-thread.c',
- 'test/test-barrier.c',
- 'test/test-condvar.c',
- 'test/test-timer-again.c',
- 'test/test-timer-from-check.c',
- 'test/test-timer.c',
- 'test/test-tty.c',
- 'test/test-udp-alloc-cb-fail.c',
- 'test/test-udp-bind.c',
- 'test/test-udp-create-socket-early.c',
- 'test/test-udp-dgram-too-big.c',
- 'test/test-udp-ipv6.c',
- 'test/test-udp-open.c',
- 'test/test-udp-options.c',
- 'test/test-udp-send-and-recv.c',
- 'test/test-udp-send-hang-loop.c',
- 'test/test-udp-send-immediate.c',
- 'test/test-udp-send-unreachable.c',
- 'test/test-udp-multicast-join.c',
- 'test/test-udp-multicast-join6.c',
- 'test/test-dlerror.c',
- 'test/test-udp-multicast-ttl.c',
- 'test/test-ip4-addr.c',
- 'test/test-ip6-addr.c',
- 'test/test-udp-multicast-interface.c',
- 'test/test-udp-multicast-interface6.c',
- 'test/test-udp-try-send.c',
- ],
- 'conditions': [
- [ 'OS=="win"', {
- 'sources': [
- 'test/runner-win.c',
- 'test/runner-win.h',
- 'src/win/snprintf.c',
- ],
- 'libraries': [ '-lws2_32' ]
- }, { # POSIX
- 'sources': [
- 'test/runner-unix.c',
- 'test/runner-unix.h',
- ],
- 'conditions': [
- [ 'OS != "zos"', {
- 'defines': [ '_GNU_SOURCE' ],
- 'cflags': [ '-Wno-long-long' ],
- 'xcode_settings': {
- 'WARNING_CFLAGS': [ '-Wno-long-long' ]
- }
- }],
- ]},
- ],
- [ 'OS in "mac dragonflybsd freebsd linux netbsd openbsd".split()', {
- 'link_settings': {
- 'libraries': [ '-lutil' ],
- },
- }],
- [ 'OS=="solaris"', { # make test-fs.c compile, needs _POSIX_C_SOURCE
- 'defines': [
- '__EXTENSIONS__',
- '_XOPEN_SOURCE=500',
- ],
- }],
- [ 'OS=="aix"', { # make test-fs.c compile, needs _POSIX_C_SOURCE
- 'defines': [
- '_ALL_SOURCE',
- '_XOPEN_SOURCE=500',
- ],
- }],
- ['uv_library=="shared_library"', {
- 'defines': [ 'USING_UV_SHARED=1' ],
- 'conditions': [
- [ 'OS == "zos"', {
- 'cflags': [ '-Wc,DLL' ],
- }],
- ],
- }],
- ],
- 'msvs-settings': {
- 'VCLinkerTool': {
- 'SubSystem': 1, # /subsystem:console
- },
- },
- },
-
- {
- 'target_name': 'run-benchmarks',
- 'type': 'executable',
- 'dependencies': [ 'libuv' ],
- 'sources': [
- 'test/benchmark-async.c',
- 'test/benchmark-async-pummel.c',
- 'test/benchmark-fs-stat.c',
- 'test/benchmark-getaddrinfo.c',
- 'test/benchmark-list.h',
- 'test/benchmark-loop-count.c',
- 'test/benchmark-million-async.c',
- 'test/benchmark-million-timers.c',
- 'test/benchmark-multi-accept.c',
- 'test/benchmark-ping-pongs.c',
- 'test/benchmark-pound.c',
- 'test/benchmark-pump.c',
- 'test/benchmark-sizes.c',
- 'test/benchmark-spawn.c',
- 'test/benchmark-thread.c',
- 'test/benchmark-tcp-write-batch.c',
- 'test/benchmark-udp-pummel.c',
- 'test/dns-server.c',
- 'test/echo-server.c',
- 'test/blackhole-server.c',
- 'test/run-benchmarks.c',
- 'test/runner.c',
- 'test/runner.h',
- 'test/task.h',
- ],
- 'conditions': [
- [ 'OS=="win"', {
- 'sources': [
- 'test/runner-win.c',
- 'test/runner-win.h',
- 'src/win/snprintf.c',
- ],
- 'libraries': [ '-lws2_32' ]
- }, { # POSIX
- 'defines': [ '_GNU_SOURCE' ],
- 'sources': [
- 'test/runner-unix.c',
- 'test/runner-unix.h',
- ]
- }],
- ['uv_library=="shared_library"', {
- 'defines': [ 'USING_UV_SHARED=1' ],
- 'conditions': [
- [ 'OS == "zos"', {
- 'cflags': [ '-Wc,DLL' ],
- }],
- ],
- }],
- ],
- 'msvs-settings': {
- 'VCLinkerTool': {
- 'SubSystem': 1, # /subsystem:console
- },
- },
- },
]
}
diff --git a/deps/uv/vcbuild.bat b/deps/uv/vcbuild.bat
index 46b3476107757a..c195394f37ea0b 100644
--- a/deps/uv/vcbuild.bat
+++ b/deps/uv/vcbuild.bat
@@ -159,13 +159,14 @@ goto run
:msbuild-found
msbuild uv.sln /t:%target% /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo
if errorlevel 1 exit /b 1
+msbuild test\test.sln /t:%target% /p:Configuration=%config% /p:Platform="%msbuild_platform%" /clp:NoSummary;NoItemAndPropertyList;Verbosity=minimal /nologo
+if errorlevel 1 exit /b 1
:run
@rem Run tests if requested.
if "%run%"=="" goto exit
-if not exist %config%\%run% goto exit
-echo running '%config%\%run%'
-%config%\%run%
+echo running 'test\%config%\%run%'
+test\%config%\%run%
goto exit
:create-msvs-files-failed
diff --git a/doc/api/addons.md b/doc/api/addons.md
index c6802530f6dc67..3641a2d6ba224a 100644
--- a/doc/api/addons.md
+++ b/doc/api/addons.md
@@ -292,7 +292,7 @@ Each of these examples using the following `binding.gyp` file:
```
In cases where there is more than one `.cc` file, simply add the additional
-filename to the `sources` array. For example:
+filename to the `sources` array:
```json
"sources": ["addon.cc", "myexample.cc"]
diff --git a/doc/api/async_hooks.md b/doc/api/async_hooks.md
index 1cd962246b988f..15bdf56e365de9 100644
--- a/doc/api/async_hooks.md
+++ b/doc/api/async_hooks.md
@@ -451,8 +451,6 @@ Note that `resolve()` does not do any observable synchronous work.
rejected at this point, if the `Promise` was resolved by assuming the state
of another `Promise`.
-For example:
-
```js
new Promise((resolve) => resolve(true)).then((a) => {});
```
@@ -481,8 +479,6 @@ changes:
* Returns: {number} The `asyncId` of the current execution context. Useful to
track when something calls.
-For example:
-
```js
const async_hooks = require('async_hooks');
@@ -493,7 +489,7 @@ fs.open(path, 'r', (err, fd) => {
```
The ID returned from `executionAsyncId()` is related to execution timing, not
-causality (which is covered by `triggerAsyncId()`). For example:
+causality (which is covered by `triggerAsyncId()`):
```js
const server = net.createServer(function onConnection(conn) {
@@ -517,8 +513,6 @@ See the section on [promise execution tracking][].
* Returns: {number} The ID of the resource responsible for calling the callback
that is currently being executed.
-For example:
-
```js
const server = net.createServer((conn) => {
// The resource that caused (or triggered) this callback to be called
@@ -692,8 +686,6 @@ deprecated: v9.6.0
-->
> Stability: 0 - Deprecated: Use [`asyncResource.runInAsyncScope()`][] instead.
-* Returns: {undefined}
-
Call all `before` callbacks to notify that a new asynchronous execution context
is being entered. If nested calls to `emitBefore()` are made, the stack of
`asyncId`s will be tracked and properly unwound.
@@ -710,8 +702,6 @@ deprecated: v9.6.0
-->
> Stability: 0 - Deprecated: Use [`asyncResource.runInAsyncScope()`][] instead.
-* Returns: {undefined}
-
Call all `after` callbacks. If nested calls to `emitBefore()` were made, then
make sure the stack is unwound properly. Otherwise an error will be thrown.
@@ -727,8 +717,6 @@ alternative.
#### `asyncResource.emitDestroy()`
-* Returns: {undefined}
-
Call all `destroy` hooks. This should only ever be called once. An error will
be thrown if it is called more than once. This **must** be manually called. If
the resource is left to be collected by the GC then the `destroy` hooks will
diff --git a/doc/api/buffer.md b/doc/api/buffer.md
index 439e9917803814..2b0ce95afa2f76 100644
--- a/doc/api/buffer.md
+++ b/doc/api/buffer.md
@@ -930,8 +930,6 @@ added: v8.2.0
For objects whose `valueOf()` function returns a value not strictly equal to
`object`, returns `Buffer.from(object.valueOf(), offsetOrEncoding, length)`.
-For example:
-
```js
const buf = Buffer.from(new String('this is a test'));
//
@@ -940,8 +938,6 @@ const buf = Buffer.from(new String('this is a test'));
For objects that support `Symbol.toPrimitive`, returns
`Buffer.from(object[Symbol.toPrimitive](), offsetOrEncoding, length)`.
-For example:
-
```js
class Foo {
[Symbol.toPrimitive]() {
diff --git a/doc/api/child_process.md b/doc/api/child_process.md
index b3a2864c67a9f8..8c305cf9ca430c 100644
--- a/doc/api/child_process.md
+++ b/doc/api/child_process.md
@@ -226,8 +226,6 @@ a Promise for an object with `stdout` and `stderr` properties. In case of an
error, a rejected promise is returned, with the same `error` object given in the
callback, but with an additional two properties `stdout` and `stderr`.
-For example:
-
```js
const util = require('util');
const exec = util.promisify(require('child_process').exec);
diff --git a/doc/api/dns.md b/doc/api/dns.md
index c1ec1cfa51c41c..cda4823e3ce0e7 100644
--- a/doc/api/dns.md
+++ b/doc/api/dns.md
@@ -114,8 +114,6 @@ Returns an array of IP address strings, formatted according to [rfc5952][],
that are currently configured for DNS resolution. A string will include a port
section if a custom port is used.
-For example:
-
```js
[
@@ -369,8 +367,6 @@ function will contain an array of objects with the following properties:
* `order`
* `preference`
-For example:
-
```js
{
@@ -558,8 +554,6 @@ Sets the IP address and port of servers to be used when performing DNS
resolution. The `servers` argument is an array of [rfc5952][] formatted
addresses. If the port is the IANA default DNS port (53) it can be omitted.
-For example:
-
```js
dns.setServers([
'4.4.4.4',
diff --git a/doc/api/domain.md b/doc/api/domain.md
index 77eff3a194238b..b303b0fdeb1746 100644
--- a/doc/api/domain.md
+++ b/doc/api/domain.md
@@ -239,8 +239,6 @@ perhaps we would like to have a separate domain to use for each request.
That is possible via explicit binding.
-For example:
-
```js
// create a top-level domain for the server
const domain = require('domain');
diff --git a/doc/api/errors.md b/doc/api/errors.md
index 25f3a55194dff4..95700d0f6707bf 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -292,8 +292,6 @@ console.error(err.message);
The `error.stack` property is a string describing the point in the code at which
the `Error` was instantiated.
-For example:
-
```txt
Error: Things keep happening!
at /home/gbusey/file.js:525:2
@@ -368,8 +366,6 @@ detailed [here](#errors_system_errors).
A subclass of `Error` that indicates the failure of an assertion. Such errors
commonly indicate inequality of actual and expected value.
-For example:
-
```js
assert.strictEqual(1, 2);
// AssertionError [ERR_ASSERTION]: 1 === 2
@@ -381,8 +377,6 @@ A subclass of `Error` that indicates that a provided argument was not within the
set or range of acceptable values for a function; whether that is a numeric
range, or outside the set of options for a given function parameter.
-For example:
-
```js
require('net').connect(-1);
// throws "RangeError: "port" option should be >= 0 and < 65536: -1"
@@ -1298,9 +1292,8 @@ compiled with ICU support.
### ERR_NO_LONGER_SUPPORTED
-A Node.js API was called in an unsupported manner.
-
-For example: `Buffer.write(string, encoding, offset[, length])`
+A Node.js API was called in an unsupported manner, such as
+`Buffer.write(string, encoding, offset[, length])`.
### ERR_OUT_OF_RANGE
diff --git a/doc/api/fs.md b/doc/api/fs.md
index 1d5679d5a4c374..dee32e8696a7c2 100644
--- a/doc/api/fs.md
+++ b/doc/api/fs.md
@@ -22,8 +22,6 @@ The arguments passed to the completion callback depend on the method, but the
first argument is always reserved for an exception. If the operation was
completed successfully, then the first argument will be `null` or `undefined`.
-For example:
-
```js
const fs = require('fs');
@@ -36,8 +34,6 @@ fs.unlink('/tmp/hello', (err) => {
Exceptions that occur using synchronous operations are thrown immediately and
may be handled using `try`/`catch`, or may be allowed to bubble up.
-For example:
-
```js
const fs = require('fs');
@@ -403,7 +399,6 @@ A `fs.Stats` object provides information about a file.
Objects returned from [`fs.stat()`][], [`fs.lstat()`][] and [`fs.fstat()`][] and
their synchronous counterparts are of this type.
-For example:
```console
Stats {
dev: 2114,
@@ -703,9 +698,6 @@ so introduces a race condition, since other processes may change the file's
state between the two calls. Instead, user code should open/read/write the
file directly and handle the error raised if the file is not accessible.
-For example:
-
-
**write (NOT RECOMMENDED)**
```js
@@ -796,7 +788,6 @@ changes:
* `path` {string|Buffer|URL}
* `mode` {integer} **Default:** `fs.constants.F_OK`
-* Returns: {undefined}
Synchronously tests a user's permissions for the file or directory specified by
`path`. The `mode` argument is an optional integer that specifies the
@@ -1354,8 +1345,6 @@ so introduces a race condition, since other processes may change the file's
state between the two calls. Instead, user code should open/read/write the
file directly and handle the error raised if the file does not exist.
-For example:
-
**write (NOT RECOMMENDED)**
```js
diff --git a/doc/api/http.md b/doc/api/http.md
index ae789a2886dfe9..e536431759c22e 100644
--- a/doc/api/http.md
+++ b/doc/api/http.md
@@ -748,10 +748,11 @@ changes:
If a client connection emits an `'error'` event, it will be forwarded here.
Listener of this event is responsible for closing/destroying the underlying
-socket. For example, one may wish to more gracefully close the socket with an
-HTTP '400 Bad Request' response instead of abruptly severing the connection.
+socket. For example, one may wish to more gracefully close the socket with a
+custom HTTP response instead of abruptly severing the connection.
-Default behavior is to destroy the socket immediately on malformed request.
+Default behavior is to close the socket with an HTTP '400 Bad Request' response
+if possible, otherwise the socket is immediately destroyed.
`socket` is the [`net.Socket`][] object that the error originated from.
diff --git a/doc/api/http2.md b/doc/api/http2.md
index 1f4eaa6fe55085..07a4e8abf6ba1f 100644
--- a/doc/api/http2.md
+++ b/doc/api/http2.md
@@ -328,7 +328,6 @@ added: v8.4.0
* `code` {number} The HTTP/2 error code to send in the final `GOAWAY` frame.
If unspecified, and `error` is not undefined, the default is `INTERNAL_ERROR`,
otherwise defaults to `NO_ERROR`.
-* Returns: {undefined}
Immediately terminates the `Http2Session` and the associated `net.Socket` or
`tls.TLSSocket`.
@@ -471,7 +470,6 @@ added: v8.4.0
* `msecs` {number}
* `callback` {Function}
-* Returns: {undefined}
Used to set a callback function that is called when there is no activity on
the `Http2Session` after `msecs` milliseconds. The given `callback` is
@@ -531,7 +529,6 @@ added: v8.4.0
-->
* `settings` {HTTP2 Settings Object}
-* Returns {undefined}
Updates the current local settings for this `Http2Session` and sends a new
`SETTINGS` frame to the connected HTTP/2 peer.
@@ -886,7 +883,6 @@ added: v8.4.0
`http2.constants.NGHTTP2_NO_ERROR` (`0x00`)
* `callback` {Function} An optional function registered to listen for the
`'close'` event.
-* Returns: {undefined}
Closes the `Http2Stream` instance by sending an `RST_STREAM` frame to the
connected HTTP/2 peer.
@@ -937,7 +933,6 @@ added: v8.4.0
and `256` (inclusive).
* `silent` {boolean} When `true`, changes the priority locally without
sending a `PRIORITY` frame to the connected peer.
-* Returns: {undefined}
Updates the priority for this `Http2Stream` instance.
@@ -998,7 +993,6 @@ added: v8.4.0
* `msecs` {number}
* `callback` {Function}
-* Returns: {undefined}
```js
const http2 = require('http2');
@@ -1094,8 +1088,6 @@ received for this stream from the connected HTTP/2 server. The listener is
invoked with two arguments: an Object containing the received
[HTTP2 Headers Object][], and flags associated with the headers.
-For example:
-
```js
const http2 = require('http2');
const client = http2.connect('https://localhost');
@@ -1123,7 +1115,6 @@ added: v8.4.0
-->
* `headers` {HTTP2 Headers Object}
-* Returns: {undefined}
Sends an additional informational `HEADERS` frame to the connected HTTP/2 peer.
@@ -1167,7 +1158,6 @@ added: v8.4.0
* `pushStream` {ServerHttp2Stream} The returned pushStream object.
* `headers` {HTTP2 Headers Object} Headers object the pushStream was
initiated with.
-* Returns: {undefined}
Initiates a push stream. The callback is invoked with the new `Http2Stream`
instance created for the push stream passed as the second argument, or an
@@ -1202,7 +1192,6 @@ added: v8.4.0
include payload data.
* `getTrailers` {Function} Callback function invoked to collect trailer
headers.
-* Returns: {undefined}
```js
const http2 = require('http2');
@@ -2008,8 +1997,6 @@ keys will be serialized to lower-case. Property values should be strings (if
they are not they will be coerced to strings) or an Array of strings (in order
to send more than one value per header field).
-For example:
-
```js
const headers = {
':status': '200',
diff --git a/doc/api/modules.md b/doc/api/modules.md
index 157ec3b6f715b9..904150ccafe4fd 100644
--- a/doc/api/modules.md
+++ b/doc/api/modules.md
@@ -729,7 +729,7 @@ exports = { hello: false }; // Not exported, only available in the module
```
When the `module.exports` property is being completely replaced by a new
-object, it is common to also reassign `exports`, for example:
+object, it is common to also reassign `exports`:
```js
diff --git a/doc/api/n-api.md b/doc/api/n-api.md
index 59228592e1d19f..ed22d380dc425b 100644
--- a/doc/api/n-api.md
+++ b/doc/api/n-api.md
@@ -59,8 +59,8 @@ example is: [node-api](https://github.com/nodejs/node-api).
In order to use the N-API functions, include the file
[node_api.h](https://github.com/nodejs/node/blob/master/src/node_api.h)
-which is located in the src directory in the node development tree.
-For example:
+which is located in the src directory in the node development tree:
+
```C
#include
```
diff --git a/doc/api/os.md b/doc/api/os.md
index bb25c3f6cc2b1b..69756fd65b1e8b 100644
--- a/doc/api/os.md
+++ b/doc/api/os.md
@@ -70,8 +70,6 @@ The properties included on each object include:
* `idle` {number} The number of milliseconds the CPU has spent in idle mode.
* `irq` {number} The number of milliseconds the CPU has spent in irq mode.
-For example:
-
```js
[
diff --git a/doc/api/path.md b/doc/api/path.md
index eb2621bfa1b208..b3569c5ea82ace 100644
--- a/doc/api/path.md
+++ b/doc/api/path.md
@@ -79,8 +79,6 @@ The `path.basename()` methods returns the last portion of a `path`, similar to
the Unix `basename` command. Trailing directory separators are ignored, see
[`path.sep`][].
-For example:
-
```js
path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'
@@ -140,8 +138,6 @@ The `path.dirname()` method returns the directory name of a `path`, similar to
the Unix `dirname` command. Trailing directory separators are ignored, see
[`path.sep`][].
-For example:
-
```js
path.dirname('/foo/bar/baz/asdf/quux');
// Returns: '/foo/bar/baz/asdf'
@@ -167,8 +163,6 @@ the `path`. If there is no `.` in the last portion of the `path`, or if the
first character of the basename of `path` (see `path.basename()`) is `.`, then
an empty string is returned.
-For example:
-
```js
path.extname('index.html');
// Returns: '.html'
@@ -302,8 +296,6 @@ Zero-length `path` segments are ignored. If the joined path string is a
zero-length string then `'.'` will be returned, representing the current
working directory.
-For example:
-
```js
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'
@@ -497,8 +489,6 @@ Zero-length `path` segments are ignored.
If no `path` segments are passed, `path.resolve()` will return the absolute path
of the current working directory.
-For example:
-
```js
path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'
diff --git a/doc/api/process.md b/doc/api/process.md
index fc2a450f9814a5..c0cac3b641580f 100644
--- a/doc/api/process.md
+++ b/doc/api/process.md
@@ -58,8 +58,6 @@ The listener callback function is invoked with the exit code specified either
by the [`process.exitCode`][] property, or the `exitCode` argument passed to the
[`process.exit()`] method, as the only argument.
-For example:
-
```js
process.on('exit', (code) => {
console.log(`About to exit with code: ${code}`);
@@ -129,8 +127,6 @@ In asynchronous code, the `'unhandledRejection'` event is emitted when the list
of unhandled rejections grows, and the `'rejectionHandled'` event is emitted
when the list of unhandled rejections shrinks.
-For example:
-
```js
const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, p) => {
@@ -161,8 +157,6 @@ behavior.
The listener function is called with the `Error` object passed as the only
argument.
-For example:
-
```js
process.on('uncaughtException', (err) => {
fs.writeSync(1, `Caught exception: ${err}\n`);
@@ -230,8 +224,6 @@ The listener function is called with the following arguments:
(typically an [`Error`][] object).
* `p` the `Promise` that was rejected.
-For example:
-
```js
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at:', p, 'reason:', reason);
@@ -355,8 +347,6 @@ The signal handler will receive the signal's name (`'SIGINT'`,
The name of each event will be the uppercase common name for the signal (e.g.
`'SIGINT'` for `SIGINT` signals).
-For example:
-
```js
// Begin reading from stdin so the process does not exit.
process.stdin.resume();
@@ -631,7 +621,17 @@ process.
```js
console.log(`Current directory: ${process.cwd()}`);
```
+## process.debugPort
+
+* {number}
+The port used by Node.js's debugger when enabled.
+
+```js
+process.debugPort = 5858;
+```
## process.disconnect()
```js
'/usr/local/bin/node'
@@ -1229,8 +1225,6 @@ group.
really just a signal sender, like the `kill` system call. The signal sent may
do something other than kill the target process.
-For example:
-
```js
process.on('SIGHUP', () => {
console.log('Got SIGHUP signal.');
@@ -1506,8 +1500,6 @@ tarball.
- `'Boron'` for the 6.x LTS line beginning with 6.9.0.
- `'Carbon'` for the 8.x LTS line beginning with 8.9.1.
-For example:
-
```js
{
@@ -1712,8 +1704,6 @@ The `process.stdin` property returns a stream connected to
stream) unless fd `0` refers to a file, in which case it is
a [Readable][] stream.
-For example:
-
```js
process.stdin.setEncoding('utf8');
diff --git a/doc/api/querystring.md b/doc/api/querystring.md
index 5bd4f1cce192a7..13593df468f4aa 100644
--- a/doc/api/querystring.md
+++ b/doc/api/querystring.md
@@ -108,8 +108,6 @@ It serializes the following types of values passed in `obj`:
{string|number|boolean|string[]|number[]|boolean[]}
Any other input values will be coerced to empty strings.
-For example:
-
```js
querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// returns 'foo=bar&baz=qux&baz=quux&corge='
diff --git a/doc/api/readline.md b/doc/api/readline.md
index 42d07da2d0e418..820507213291f3 100644
--- a/doc/api/readline.md
+++ b/doc/api/readline.md
@@ -75,8 +75,6 @@ presses the ``, or `` keys.
The listener function is called with a string containing the single line of
received input.
-For example:
-
```js
rl.on('line', (input) => {
console.log(`Received: ${input}`);
@@ -96,8 +94,6 @@ The `'pause'` event is emitted when one of the following occur:
The listener function is called without passing any arguments.
-For example:
-
```js
rl.on('pause', () => {
console.log('Readline paused.');
@@ -133,8 +129,6 @@ not be emitted.
The listener function is invoked without passing any arguments.
-For example:
-
```js
rl.on('SIGCONT', () => {
// `prompt` will automatically resume the stream
@@ -156,8 +150,6 @@ event will be emitted.
The listener function is invoked without passing any arguments.
-For example:
-
```js
rl.on('SIGINT', () => {
rl.question('Are you sure you want to exit? ', (answer) => {
@@ -184,8 +176,6 @@ paused before the process was sent to the background.
The listener function is invoked without passing any arguments.
-For example:
-
```js
rl.on('SIGTSTP', () => {
// This will override SIGTSTP and prevent the program from going to the
@@ -307,8 +297,6 @@ paused.
If the `readline.Interface` was created with `output` set to `null` or
`undefined` the `data` and `key` are not written.
-For example:
-
```js
rl.write('Delete this!');
// Simulate Ctrl+u to delete the line written previously
@@ -387,8 +375,6 @@ changes:
The `readline.createInterface()` method creates a new `readline.Interface`
instance.
-For example:
-
```js
const readline = require('readline');
const rl = readline.createInterface({
diff --git a/doc/api/repl.md b/doc/api/repl.md
index 506f54a4b8a2a8..076f66171213b0 100644
--- a/doc/api/repl.md
+++ b/doc/api/repl.md
@@ -96,7 +96,7 @@ are declared at the global scope.
The default evaluator provides access to any variables that exist in the global
scope. It is possible to expose a variable to the REPL explicitly by assigning
-it to the `context` object associated with each `REPLServer`. For example:
+it to the `context` object associated with each `REPLServer`:
```js
const repl = require('repl');
diff --git a/doc/api/stream.md b/doc/api/stream.md
index 529a6681e316b1..424f3cfc33924c 100644
--- a/doc/api/stream.md
+++ b/doc/api/stream.md
@@ -1136,8 +1136,6 @@ It will rarely be necessary to use `readable.wrap()` but the method has been
provided as a convenience for interacting with older Node.js applications and
libraries.
-For example:
-
```js
const { OldReader } = require('./old-api-module.js');
const { Readable } = require('stream');
@@ -1313,8 +1311,6 @@ inheritance. This can be accomplished by directly creating instances of the
`stream.Writable`, `stream.Readable`, `stream.Duplex` or `stream.Transform`
objects and passing appropriate methods as constructor options.
-For example:
-
```js
const { Writable } = require('stream');
@@ -1356,8 +1352,6 @@ constructor and implement the `writable._write()` method. The
* `final` {Function} Implementation for the
[`stream._final()`][stream-_final] method.
-For example:
-
```js
const { Writable } = require('stream');
@@ -1606,8 +1600,6 @@ constructor and implement the `readable._read()` method.
* `destroy` {Function} Implementation for the [`stream._destroy()`][readable-_destroy]
method.
-For example:
-
```js
const { Readable } = require('stream');
@@ -1757,6 +1749,10 @@ class SourceWrapper extends Readable {
*Note*: The `readable.push()` method is intended be called only by Readable
Implementers, and only from within the `readable._read()` method.
+For streams not operating in object mode, if the `chunk` parameter of
+`readable.push()` is `undefined`, it will be treated as empty string or
+buffer. See [`readable.push('')`][] for more information.
+
#### Errors While Reading
It is recommended that errors occurring during the processing of the
@@ -1854,8 +1850,6 @@ changes:
* `writableHighWaterMark` {number} Sets `highWaterMark` for the writable side
of the stream. Has no effect if `highWaterMark` is provided.
-For example:
-
```js
const { Duplex } = require('stream');
@@ -2010,8 +2004,6 @@ the output on the Readable side is not consumed.
* `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush]
method.
-For example:
-
```js
const { Transform } = require('stream');
@@ -2276,6 +2268,7 @@ contain multi-byte characters.
[`stream.uncork()`]: #stream_writable_uncork
[`stream.unpipe()`]: #stream_readable_unpipe_destination
[`stream.wrap()`]: #stream_readable_wrap_stream
+[`readable.push('')`]: #stream_readable_push
[`writable.cork()`]: #stream_writable_cork
[`writable.uncork()`]: #stream_writable_uncork
[`zlib.createDeflate()`]: zlib.html#zlib_zlib_createdeflate_options
diff --git a/doc/api/timers.md b/doc/api/timers.md
index 09502dee1003c8..13f2dea37d9d23 100644
--- a/doc/api/timers.md
+++ b/doc/api/timers.md
@@ -18,6 +18,38 @@ This object is created internally and is returned from [`setImmediate()`][]. It
can be passed to [`clearImmediate()`][] in order to cancel the scheduled
actions.
+By default, when an immediate is scheduled, the Node.js event loop will continue
+running as long as the immediate is active. The `Immediate` object returned by
+[`setImmediate()`][] exports both `immediate.ref()` and `immediate.unref()`
+functions that can be used to control this default behavior.
+
+### immediate.ref()
+
+
+When called, requests that the Node.js event loop *not* exit so long as the
+`Immediate` is active. Calling `immediate.ref()` multiple times will have no
+effect.
+
+*Note*: By default, all `Immediate` objects are "ref'd", making it normally
+unnecessary to call `immediate.ref()` unless `immediate.unref()` had been called
+previously.
+
+Returns a reference to the `Immediate`.
+
+### immediate.unref()
+
+
+When called, the active `Immediate` object will not require the Node.js event
+loop to remain active. If there is no other activity keeping the event loop
+running, the process may exit before the `Immediate` object's callback is
+invoked. Calling `immediate.unref()` multiple times will have no effect.
+
+Returns a reference to the `Immediate`.
+
## Class: Timeout
This object is created internally and is returned from [`setTimeout()`][] and
diff --git a/doc/api/util.md b/doc/api/util.md
index 00d04df8f850ee..db56da1618e6f7 100644
--- a/doc/api/util.md
+++ b/doc/api/util.md
@@ -26,8 +26,6 @@ a `(err, value) => ...` callback as the last argument. In the callback, the
first argument will be the rejection reason (or `null` if the Promise
resolved), and the second argument will be the resolved value.
-For example:
-
```js
const util = require('util');
@@ -86,8 +84,6 @@ environment variable. If the `section` name appears within the value of that
environment variable, then the returned function operates similar to
[`console.error()`][]. If not, then the returned function is a no-op.
-For example:
-
```js
const util = require('util');
const debuglog = util.debuglog('foo');
@@ -105,7 +101,7 @@ FOO 3245: hello from foo [123]
where `3245` is the process id. If it is not run with that
environment variable set, then it will not print anything.
-The `section` supports wildcard also, for example:
+The `section` supports wildcard also:
```js
const util = require('util');
const debuglog = util.debuglog('foo-bar');
@@ -119,7 +115,7 @@ FOO-BAR 3257: hi there, it's foo-bar [2333]
```
Multiple comma-separated `section` names may be specified in the `NODE_DEBUG`
-environment variable. For example: `NODE_DEBUG=fs,net,tls`.
+environment variable: `NODE_DEBUG=fs,net,tls`.
## util.deprecate(function, string)
```js
{
diff --git a/doc/guides/node-postmortem-support.md b/doc/guides/node-postmortem-support.md
new file mode 100644
index 00000000000000..e29d9ca3a1fdf0
--- /dev/null
+++ b/doc/guides/node-postmortem-support.md
@@ -0,0 +1,72 @@
+# Postmortem Support
+
+Postmortem metadata are constants present in the final build which can be used
+by debuggers and other tools to navigate through internal structures of software
+when analyzing its memory (either on a running process or a core dump). Node
+provides this metadata in its builds for V8 and Node internal structures.
+
+
+### V8 Postmortem metadata
+
+V8 prefixes all postmortem constants with `v8dbg_`, and they allow inspection of
+objects on the heap as well as object properties and references. V8 generates
+those symbols with a script (`deps/v8/tools/gen-postmortem-metadata.py`), and
+Node always includes these constants in the final build.
+
+### Node Debug Symbols
+
+Node prefixes all postmortem constants with `nodedbg_`, and they complement V8
+constants by providing ways to inspect Node-specific structures, like
+`node::Environment`, `node::BaseObject` and its descendants, classes from
+`src/utils.h` and others. Those constants are declared in
+`src/node_postmortem_metadata.cc`, and most of them are calculated at compile
+time.
+
+#### Calculating offset of class members
+
+Node constants referring to the offset of class members in memory are calculated
+at compile time. Because of that, those class members must be at a fixed offset
+from the start of the class. That's not a problem in most cases, but it also
+means that those members should always come after any templated member on the
+class definition.
+
+For example, if we want to add a constant with the offset for
+`ReqWrap::req_wrap_queue_`, it should be defined after `ReqWrap::req_`, because
+`sizeof(req_)` depends on the type of T, which means the class definition should
+be like this:
+
+```c++
+template
+class ReqWrap : public AsyncWrap {
+ private:
+ // req_wrap_queue_ comes before any templated member, which places it in a
+ // fixed offset from the start of the class
+ ListNode req_wrap_queue_;
+
+ T req_;
+};
+```
+
+instead of:
+
+```c++
+template
+class ReqWrap : public AsyncWrap {
+ private:
+ T req_;
+
+ // req_wrap_queue_ comes after a templated member, which means it won't be in
+ // a fixed offset from the start of the class
+ ListNode req_wrap_queue_;
+};
+```
+
+There are also tests on `test/cctest/test_node_postmortem_metadata.cc` to make
+sure all Node postmortem metadata are calculated correctly.
+
+## Tools and References
+
+* [llnode](https://github.com/nodejs/llnode): LLDB plugin
+* [`mdb_v8`](https://github.com/joyent/mdb_v8): mdb plugin
+* [nodejs/post-mortem](https://github.com/nodejs/post-mortem): Node.js
+post-mortem working group
diff --git a/doc/guides/using-internal-errors.md b/doc/guides/using-internal-errors.md
index 90962757bb0bb2..c03f44623a0f7f 100644
--- a/doc/guides/using-internal-errors.md
+++ b/doc/guides/using-internal-errors.md
@@ -99,8 +99,6 @@ special cases, they should only validate that the expected code is received
and NOT validate the message. This will reduce the amount of test change
required when the message for an error changes.
-For example:
-
```js
assert.throws(() => {
socket.bind();
diff --git a/doc/guides/writing-tests.md b/doc/guides/writing-tests.md
index 949aea402db5c8..aa4412e1613c2c 100644
--- a/doc/guides/writing-tests.md
+++ b/doc/guides/writing-tests.md
@@ -127,7 +127,7 @@ explanation go [here](https://github.com/nodejs/testing/issues/27).
In the event a test needs a timer, consider using the
`common.platformTimeout()` method. It allows setting specific timeouts
-depending on the platform. For example:
+depending on the platform:
```javascript
const timer = setTimeout(fail, common.platformTimeout(4000));
@@ -259,9 +259,7 @@ features in JavaScript code in the `lib` directory. However, when writing
tests, for the ease of backporting, it is encouraged to use those ES.Next
features that can be used directly without a flag in
[all maintained branches][]. [node.green][] lists available features
-in each release.
-
-For example:
+in each release, such as:
- `let` and `const` over `var`
- Template literals over string concatenation
diff --git a/doc/onboarding.md b/doc/onboarding.md
index 7f262e26665906..a85e493d3c7561 100644
--- a/doc/onboarding.md
+++ b/doc/onboarding.md
@@ -5,22 +5,17 @@ onboarding session.
## One week before the onboarding session
-* Confirm that the new Collaborator is using two-factor authentication on their
- GitHub account. Unless two-factor authentication is enabled, do not give an
- account elevated privileges such as the ability to land code in the main
- repository or to start continuous integration (CI) jobs.
+* If the new Collaborator is not yet a member of the nodejs GitHub organization,
+ confirm that they are using two-factor authentication. It will not be possible
+ to add them to the organization if they are not using two-factor
+ authentication.
* Announce the accepted nomination in a TSC meeting and in the TSC
mailing list.
## Fifteen minutes before the onboarding session
* Prior to the onboarding session, add the new Collaborator to
- [the Collaborators team](https://github.com/orgs/nodejs/teams/collaborators),
- and to [the Members team](https://github.com/orgs/nodejs/teams/members) if
- they are not already part of it. Note that this is the step that gives the
- account elevated privileges, so do not perform this step (or any subsequent
- steps) unless two-factor authentication is enabled on the new Collaborator's
- GitHub account.
+ [the Collaborators team](https://github.com/orgs/nodejs/teams/collaborators).
## Onboarding session
diff --git a/lib/_http_agent.js b/lib/_http_agent.js
index 5f1e56caeab981..7586a48680bb6a 100644
--- a/lib/_http_agent.js
+++ b/lib/_http_agent.js
@@ -277,6 +277,7 @@ function installListeners(agent, s, options) {
s.removeListener('close', onClose);
s.removeListener('free', onFree);
s.removeListener('agentRemove', onRemove);
+ s._httpMessage = null;
}
s.on('agentRemove', onRemove);
}
diff --git a/lib/_http_client.js b/lib/_http_client.js
index 62eef956b3574e..63efb06b8f7f9c 100644
--- a/lib/_http_client.js
+++ b/lib/_http_client.js
@@ -37,7 +37,7 @@ const { OutgoingMessage } = require('_http_outgoing');
const Agent = require('_http_agent');
const { Buffer } = require('buffer');
const { urlToOptions, searchParamsSymbol } = require('internal/url');
-const { outHeadersKey } = require('internal/http');
+const { outHeadersKey, ondrain } = require('internal/http');
const { nextTick } = require('internal/process/next_tick');
const errors = require('internal/errors');
@@ -456,6 +456,7 @@ function socketOnData(d) {
socket.removeListener('data', socketOnData);
socket.removeListener('end', socketOnEnd);
+ socket.removeListener('drain', ondrain);
parser.finish();
freeParser(parser, req, socket);
diff --git a/lib/_http_server.js b/lib/_http_server.js
index 9541993df53321..111a8525c47d62 100644
--- a/lib/_http_server.js
+++ b/lib/_http_server.js
@@ -680,7 +680,7 @@ function onSocketPause() {
function unconsume(parser, socket) {
if (socket._handle) {
if (parser._consumed)
- parser.unconsume(socket._handle._externalStream);
+ parser.unconsume();
parser._consumed = false;
socket.removeListener('pause', onSocketPause);
socket.removeListener('resume', onSocketResume);
diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js
index 85d72f876124fa..06bed3faaa4870 100644
--- a/lib/internal/bootstrap_node.js
+++ b/lib/internal/bootstrap_node.js
@@ -409,6 +409,8 @@
}
}
+ function noop() {}
+
function setupProcessFatal() {
const async_wrap = process.binding('async_wrap');
// Arrays containing hook flags and ids for async_hook calls.
@@ -419,23 +421,15 @@
kDefaultTriggerAsyncId, kStackLength } = async_wrap.constants;
process._fatalException = function(er) {
- var caught;
-
// It's possible that kDefaultTriggerAsyncId was set for a constructor
// call that threw and was never cleared. So clear it now.
async_id_fields[kDefaultTriggerAsyncId] = -1;
if (exceptionHandlerState.captureFn !== null) {
exceptionHandlerState.captureFn(er);
- caught = true;
- }
-
- if (!caught)
- caught = process.emit('uncaughtException', er);
-
- // If someone handled it, then great. otherwise, die in C++ land
- // since that means that we'll exit the process, emit the 'exit' event
- if (!caught) {
+ } else if (!process.emit('uncaughtException', er)) {
+ // If someone handled it, then great. otherwise, die in C++ land
+ // since that means that we'll exit the process, emit the 'exit' event
try {
if (!process._exiting) {
process._exiting = true;
@@ -444,24 +438,25 @@
} catch (er) {
// nothing to be done about it at this point.
}
+ return false;
+ }
+ // If we handled an error, then make sure any ticks get processed
+ // by ensuring that the next Immediate cycle isn't empty
+ NativeModule.require('timers').setImmediate(noop);
+
+ // Emit the after() hooks now that the exception has been handled.
+ if (async_hook_fields[kAfter] > 0) {
+ const { emitAfter } = NativeModule.require('internal/async_hooks');
+ do {
+ emitAfter(async_id_fields[kExecutionAsyncId]);
+ } while (async_hook_fields[kStackLength] > 0);
+ // Or completely empty the id stack.
} else {
- // If we handled an error, then make sure any ticks get processed
- NativeModule.require('timers').setImmediate(process._tickCallback);
-
- // Emit the after() hooks now that the exception has been handled.
- if (async_hook_fields[kAfter] > 0) {
- do {
- NativeModule.require('internal/async_hooks').emitAfter(
- async_id_fields[kExecutionAsyncId]);
- } while (async_hook_fields[kStackLength] > 0);
- // Or completely empty the id stack.
- } else {
- clearAsyncIdStack();
- }
+ clearAsyncIdStack();
}
- return caught;
+ return true;
};
}
@@ -634,7 +629,7 @@
};
NativeModule.wrapper = [
- '(function (exports, require, module, internalBinding) {',
+ '(function (exports, require, module, internalBinding, process) {',
'\n});'
];
@@ -650,7 +645,7 @@
lineOffset: 0,
displayErrors: true
});
- fn(this.exports, NativeModule.require, this, internalBinding);
+ fn(this.exports, NativeModule.require, this, internalBinding, process);
this.loaded = true;
} finally {
diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js
index 13d0a11aa1e705..44904658217d77 100644
--- a/lib/internal/child_process.js
+++ b/lib/internal/child_process.js
@@ -455,7 +455,10 @@ function setupChannel(target, channel) {
var jsonBuffer = '';
var pendingHandle = null;
channel.buffering = false;
- channel.onread = function(nread, pool, recvHandle) {
+ channel.pendingHandle = null;
+ channel.onread = function(nread, pool) {
+ const recvHandle = channel.pendingHandle;
+ channel.pendingHandle = null;
// TODO(bnoordhuis) Check that nread > 0.
if (pool) {
if (recvHandle)
diff --git a/lib/internal/cluster/master.js b/lib/internal/cluster/master.js
index 570cf7bc6f93d4..3c6a398f117433 100644
--- a/lib/internal/cluster/master.js
+++ b/lib/internal/cluster/master.js
@@ -14,6 +14,7 @@ const intercom = new EventEmitter();
const SCHED_NONE = 1;
const SCHED_RR = 2;
const { isLegalPort } = require('internal/net');
+const [ minPort, maxPort ] = [ 1024, 65535 ];
module.exports = cluster;
@@ -119,6 +120,8 @@ function createWorkerProcess(id, env) {
}
} else {
inspectPort = process.debugPort + debugPortOffset;
+ if (inspectPort > maxPort)
+ inspectPort = inspectPort - maxPort + minPort - 1;
debugPortOffset++;
}
diff --git a/lib/internal/net.js b/lib/internal/net.js
index d4558cfca8e214..847539d576906d 100644
--- a/lib/internal/net.js
+++ b/lib/internal/net.js
@@ -1,5 +1,8 @@
'use strict';
+const Buffer = require('buffer').Buffer;
+const { writeBuffer } = process.binding('fs');
+
// Check that the port number is not NaN when coerced to a number,
// is an integer and that it falls within the legal range of port numbers.
function isLegalPort(port) {
@@ -9,7 +12,28 @@ function isLegalPort(port) {
return +port === (+port >>> 0) && port <= 0xFFFF;
}
+function makeSyncWrite(fd) {
+ return function(chunk, enc, cb) {
+ if (enc !== 'buffer')
+ chunk = Buffer.from(chunk, enc);
+
+ this._bytesDispatched += chunk.length;
+
+ try {
+ writeBuffer(fd, chunk, 0, chunk.length, null);
+ } catch (ex) {
+ // Legacy: net writes have .code === .errno, whereas writeBuffer gives the
+ // raw errno number in .errno.
+ if (typeof ex.code === 'string')
+ ex.errno = ex.code;
+ return cb(ex);
+ }
+ cb();
+ };
+}
+
module.exports = {
isLegalPort,
+ makeSyncWrite,
normalizedArgsSymbol: Symbol('normalizedArgs')
};
diff --git a/lib/internal/process/next_tick.js b/lib/internal/process/next_tick.js
index bf7d0bc94dc4ce..9481bebd224be6 100644
--- a/lib/internal/process/next_tick.js
+++ b/lib/internal/process/next_tick.js
@@ -1,47 +1,9 @@
'use strict';
-// This value is used to prevent the nextTickQueue from becoming too
-// large and cause the process to run out of memory. When this value
-// is reached the nextTimeQueue array will be shortened (see tickDone
-// for details).
-const kMaxCallbacksPerLoop = 1e4;
-
exports.setup = setupNextTick;
// Will be overwritten when setupNextTick() is called.
exports.nextTick = null;
-class NextTickQueue {
- constructor() {
- this.head = null;
- this.tail = null;
- }
-
- push(v) {
- const entry = { data: v, next: null };
- if (this.tail !== null)
- this.tail.next = entry;
- else
- this.head = entry;
- this.tail = entry;
- }
-
- shift() {
- if (this.head === null)
- return;
- const ret = this.head.data;
- if (this.head === this.tail)
- this.head = this.tail = null;
- else
- this.head = this.head.next;
- return ret;
- }
-
- clear() {
- this.head = null;
- this.tail = null;
- }
-}
-
function setupNextTick() {
const async_wrap = process.binding('async_wrap');
const async_hooks = require('internal/async_hooks');
@@ -56,15 +18,47 @@ function setupNextTick() {
// Grab the constants necessary for working with internal arrays.
const { kInit, kDestroy, kAsyncIdCounter } = async_wrap.constants;
const { async_id_symbol, trigger_async_id_symbol } = async_wrap;
- const nextTickQueue = new NextTickQueue();
- var microtasksScheduled = false;
- // Used to run V8's micro task queue.
- var _runMicrotasks = {};
+ // tickInfo is used so that the C++ code in src/node.cc can
+ // have easy access to our nextTick state, and avoid unnecessary
+ // calls into JS land.
+ // runMicrotasks is used to run V8's micro task queue.
+ const [
+ tickInfo,
+ runMicrotasks
+ ] = process._setupNextTick(_tickCallback);
// *Must* match Environment::TickInfo::Fields in src/env.h.
- var kIndex = 0;
- var kLength = 1;
+ const kHasScheduled = 0;
+
+ const nextTickQueue = {
+ head: null,
+ tail: null,
+ push(data) {
+ const entry = { data, next: null };
+ if (this.tail !== null) {
+ this.tail.next = entry;
+ } else {
+ this.head = entry;
+ tickInfo[kHasScheduled] = 1;
+ }
+ this.tail = entry;
+ },
+ shift() {
+ if (this.head === null)
+ return;
+ const ret = this.head.data;
+ if (this.head === this.tail) {
+ this.head = this.tail = null;
+ tickInfo[kHasScheduled] = 0;
+ } else {
+ this.head = this.head.next;
+ }
+ return ret;
+ }
+ };
+
+ var microtasksScheduled = false;
process.nextTick = nextTick;
// Needs to be accessible from beyond this scope.
@@ -73,25 +67,6 @@ function setupNextTick() {
// Set the nextTick() function for internal usage.
exports.nextTick = internalNextTick;
- // This tickInfo thing is used so that the C++ code in src/node.cc
- // can have easy access to our nextTick state, and avoid unnecessary
- // calls into JS land.
- const tickInfo = process._setupNextTick(_tickCallback, _runMicrotasks);
-
- _runMicrotasks = _runMicrotasks.runMicrotasks;
-
- function tickDone() {
- if (tickInfo[kLength] !== 0) {
- if (tickInfo[kLength] <= tickInfo[kIndex]) {
- nextTickQueue.clear();
- tickInfo[kLength] = 0;
- } else {
- tickInfo[kLength] -= tickInfo[kIndex];
- }
- }
- tickInfo[kIndex] = 0;
- }
-
const microTasksTickObject = {
callback: runMicrotasksCallback,
args: undefined,
@@ -105,38 +80,27 @@ function setupNextTick() {
// For the moment all microtasks come from the void until the PromiseHook
// API is implemented.
nextTickQueue.push(microTasksTickObject);
-
- tickInfo[kLength]++;
microtasksScheduled = true;
}
function runMicrotasksCallback() {
microtasksScheduled = false;
- _runMicrotasks();
+ runMicrotasks();
- if (tickInfo[kIndex] < tickInfo[kLength] ||
- emitPendingUnhandledRejections()) {
+ if (nextTickQueue.head !== null || emitPendingUnhandledRejections())
scheduleMicrotasks();
- }
}
function _tickCallback() {
+ let tock;
do {
- while (tickInfo[kIndex] < tickInfo[kLength]) {
- ++tickInfo[kIndex];
- const tock = nextTickQueue.shift();
-
- // CHECK(Number.isSafeInteger(tock[async_id_symbol]))
- // CHECK(tock[async_id_symbol] > 0)
- // CHECK(Number.isSafeInteger(tock[trigger_async_id_symbol]))
- // CHECK(tock[trigger_async_id_symbol] > 0)
-
+ while (tock = nextTickQueue.shift()) {
const asyncId = tock[async_id_symbol];
emitBefore(asyncId, tock[trigger_async_id_symbol]);
// emitDestroy() places the async_id_symbol into an asynchronous queue
// that calls the destroy callback in the future. It's called before
// calling tock.callback so destroy will be called even if the callback
- // throws an exception that is handles by 'uncaughtException' or a
+ // throws an exception that is handled by 'uncaughtException' or a
// domain.
// TODO(trevnorris): This is a bit of a hack. It relies on the fact
// that nextTick() doesn't allow the event loop to proceed, but if
@@ -152,24 +116,21 @@ function setupNextTick() {
Reflect.apply(callback, undefined, tock.args);
emitAfter(asyncId);
-
- if (kMaxCallbacksPerLoop < tickInfo[kIndex])
- tickDone();
}
- tickDone();
- _runMicrotasks();
+ runMicrotasks();
emitPendingUnhandledRejections();
- } while (tickInfo[kLength] !== 0);
+ } while (nextTickQueue.head !== null);
}
class TickObject {
- constructor(callback, args, asyncId, triggerAsyncId) {
+ constructor(callback, args, triggerAsyncId) {
// this must be set to null first to avoid function tracking
// on the hidden class, revisit in V8 versions after 6.2
this.callback = null;
this.callback = callback;
this.args = args;
+ const asyncId = ++async_id_fields[kAsyncIdCounter];
this[async_id_symbol] = asyncId;
this[trigger_async_id_symbol] = triggerAsyncId;
@@ -203,13 +164,7 @@ function setupNextTick() {
args[i - 1] = arguments[i];
}
- // In V8 6.2, moving tickInfo & async_id_fields[kAsyncIdCounter] into the
- // TickObject incurs a significant performance penalty in the
- // next-tick-breadth-args benchmark (revisit later)
- ++tickInfo[kLength];
- nextTickQueue.push(new TickObject(callback,
- args,
- ++async_id_fields[kAsyncIdCounter],
+ nextTickQueue.push(new TickObject(callback, args,
getDefaultTriggerAsyncId()));
}
@@ -238,13 +193,6 @@ function setupNextTick() {
if (triggerAsyncId === null)
triggerAsyncId = getDefaultTriggerAsyncId();
- // In V8 6.2, moving tickInfo & async_id_fields[kAsyncIdCounter] into the
- // TickObject incurs a significant performance penalty in the
- // next-tick-breadth-args benchmark (revisit later)
- ++tickInfo[kLength];
- nextTickQueue.push(new TickObject(callback,
- args,
- ++async_id_fields[kAsyncIdCounter],
- triggerAsyncId));
+ nextTickQueue.push(new TickObject(callback, args, triggerAsyncId));
}
}
diff --git a/lib/internal/streams/destroy.js b/lib/internal/streams/destroy.js
index 86a22633f2fe78..985332ac4607a8 100644
--- a/lib/internal/streams/destroy.js
+++ b/lib/internal/streams/destroy.js
@@ -55,6 +55,8 @@ function undestroy() {
this._writableState.destroyed = false;
this._writableState.ended = false;
this._writableState.ending = false;
+ this._writableState.finalCalled = false;
+ this._writableState.prefinished = false;
this._writableState.finished = false;
this._writableState.errorEmitted = false;
}
diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js
index 5c6b1407120ea2..43ccc0e5d8bfac 100644
--- a/lib/internal/v8_prof_polyfill.js
+++ b/lib/internal/v8_prof_polyfill.js
@@ -96,6 +96,13 @@ function readline() {
if (line.length === 0) {
return '';
}
+ if (bytes === 0) {
+ process.emitWarning(`Profile file ${logFile} is broken`, {
+ code: 'BROKEN_PROFILE_FILE',
+ detail: `${JSON.stringify(line)} at the file end is broken`
+ });
+ return '';
+ }
}
}
diff --git a/lib/net.js b/lib/net.js
index c04d04473900d0..95dd6615b39c86 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -26,7 +26,11 @@ const stream = require('stream');
const timers = require('timers');
const util = require('util');
const internalUtil = require('internal/util');
-const { isLegalPort, normalizedArgsSymbol } = require('internal/net');
+const {
+ isLegalPort,
+ normalizedArgsSymbol,
+ makeSyncWrite
+} = require('internal/net');
const assert = require('assert');
const cares = process.binding('cares_wrap');
const {
@@ -213,20 +217,24 @@ function Socket(options) {
this._handle = options.handle; // private
this[async_id_symbol] = getNewAsyncId(this._handle);
} else if (options.fd !== undefined) {
- this._handle = createHandle(options.fd, false);
- this._handle.open(options.fd);
+ const fd = options.fd;
+ this._handle = createHandle(fd, false);
+ this._handle.open(fd);
this[async_id_symbol] = this._handle.getAsyncId();
// options.fd can be string (since it is user-defined),
// so changing this to === would be semver-major
// See: https://github.com/nodejs/node/pull/11513
// eslint-disable-next-line eqeqeq
- if ((options.fd == 1 || options.fd == 2) &&
+ if ((fd == 1 || fd == 2) &&
(this._handle instanceof Pipe) &&
process.platform === 'win32') {
// Make stdout and stderr blocking on Windows
var err = this._handle.setBlocking(true);
if (err)
throw errnoException(err, 'setBlocking');
+
+ this._writev = null;
+ this._write = makeSyncWrite(fd);
}
this.readable = options.readable !== false;
this.writable = options.writable !== false;
@@ -236,8 +244,7 @@ function Socket(options) {
}
// shut down the socket when we're finished with it.
- this.on('finish', onSocketFinish);
- this.on('_socketEnd', onSocketEnd);
+ this.on('end', onReadableStreamEnd);
initSocketHandle(this);
@@ -280,39 +287,42 @@ Socket.prototype._unrefTimer = function _unrefTimer() {
function shutdownSocket(self, callback) {
var req = new ShutdownWrap();
- req.oncomplete = callback;
+ req.oncomplete = afterShutdown;
req.handle = self._handle;
+ req.callback = callback;
return self._handle.shutdown(req);
}
// the user has called .end(), and all the bytes have been
// sent out to the other side.
-function onSocketFinish() {
- // If still connecting - defer handling 'finish' until 'connect' will happen
+Socket.prototype._final = function(cb) {
+ // If still connecting - defer handling `_final` until 'connect' will happen
if (this.connecting) {
- debug('osF: not yet connected');
- return this.once('connect', onSocketFinish);
+ debug('_final: not yet connected');
+ return this.once('connect', () => this._final(cb));
}
- debug('onSocketFinish');
if (!this.readable || this._readableState.ended) {
- debug('oSF: ended, destroy', this._readableState);
+ debug('_final: ended, destroy', this._readableState);
+ cb();
return this.destroy();
}
- debug('oSF: not ended, call shutdown()');
+ debug('_final: not ended, call shutdown()');
// otherwise, just shutdown, or destroy() if not possible
- if (!this._handle || !this._handle.shutdown)
+ if (!this._handle || !this._handle.shutdown) {
+ cb();
return this.destroy();
+ }
var err = defaultTriggerAsyncIdScope(
- this[async_id_symbol], shutdownSocket, this, afterShutdown
+ this[async_id_symbol], shutdownSocket, this, cb
);
if (err)
return this.destroy(errnoException(err, 'shutdown'));
-}
+};
function afterShutdown(status, handle, req) {
@@ -321,6 +331,8 @@ function afterShutdown(status, handle, req) {
debug('afterShutdown destroyed=%j', self.destroyed,
self._readableState);
+ this.callback();
+
// callback may come after call to destroy.
if (self.destroyed)
return;
@@ -333,32 +345,6 @@ function afterShutdown(status, handle, req) {
}
}
-// the EOF has been received, and no more bytes are coming.
-// if the writable side has ended already, then clean everything
-// up.
-function onSocketEnd() {
- // XXX Should not have to do as much in this function.
- // ended should already be true, since this is called *after*
- // the EOF errno and onread has eof'ed
- debug('onSocketEnd', this._readableState);
- this._readableState.ended = true;
- if (this._readableState.endEmitted) {
- this.readable = false;
- maybeDestroy(this);
- } else {
- this.once('end', function end() {
- this.readable = false;
- maybeDestroy(this);
- });
- this.read(0);
- }
-
- if (!this.allowHalfOpen) {
- this.write = writeAfterFIN;
- this.destroySoon();
- }
-}
-
// Provide a better error message when we call end() as a result
// of the other side sending a FIN. The standard 'write after end'
// is overly vague, and makes it seem like the user's code is to blame.
@@ -504,6 +490,12 @@ Socket.prototype.end = function(data, encoding, callback) {
};
+// Called when the 'end' event is emitted.
+function onReadableStreamEnd() {
+ maybeDestroy(this);
+}
+
+
// Call whenever we set writable=false or readable=false
function maybeDestroy(socket) {
if (!socket.readable &&
@@ -617,10 +609,11 @@ function onread(nread, buffer) {
// Do it before `maybeDestroy` for correct order of events:
// `end` -> `close`
self.push(null);
+ self.read(0);
- if (self.readableLength === 0) {
- self.readable = false;
- maybeDestroy(self);
+ if (!self.allowHalfOpen) {
+ self.write = writeAfterFIN;
+ self.destroySoon();
}
// internal end event so that we know that the actual socket
diff --git a/lib/repl.js b/lib/repl.js
index ef62753134db6d..b7af18ed492a9f 100644
--- a/lib/repl.js
+++ b/lib/repl.js
@@ -650,7 +650,7 @@ REPLServer.prototype.createContext = function() {
} else {
sendInspectorCommand((session) => {
session.post('Runtime.enable');
- session.on('Runtime.executionContextCreated', ({ params }) => {
+ session.once('Runtime.executionContextCreated', ({ params }) => {
this[kContextId] = params.context.id;
});
context = vm.createContext();
@@ -834,7 +834,6 @@ function complete(line, callback) {
var flat = new ArrayStream(); // make a new "input" stream
var magic = new REPLServer('', flat); // make a nested REPL
replMap.set(magic, replMap.get(this));
- magic.resetContext();
flat.run(tmp); // eval the flattened code
// all this is only profitable if the nested REPL
// does not have a bufferedCommand
diff --git a/lib/timers.js b/lib/timers.js
index 43d2cbbd07bdb3..46cd770fc643bd 100644
--- a/lib/timers.js
+++ b/lib/timers.js
@@ -22,7 +22,10 @@
'use strict';
const async_wrap = process.binding('async_wrap');
-const TimerWrap = process.binding('timer_wrap').Timer;
+const {
+ Timer: TimerWrap,
+ setImmediateCallback,
+} = process.binding('timer_wrap');
const L = require('internal/linkedlist');
const internalUtil = require('internal/util');
const { createPromise, promiseResolve } = process.binding('util');
@@ -47,12 +50,15 @@ const { kInit, kDestroy, kAsyncIdCounter } = async_wrap.constants;
const async_id_symbol = Symbol('asyncId');
const trigger_async_id_symbol = Symbol('triggerAsyncId');
-/* This is an Uint32Array for easier sharing with C++ land. */
-const scheduledImmediateCount = process._scheduledImmediateCount;
-delete process._scheduledImmediateCount;
-/* Kick off setImmediate processing */
-const activateImmediateCheck = process._activateImmediateCheck;
-delete process._activateImmediateCheck;
+// *Must* match Environment::ImmediateInfo::Fields in src/env.h.
+const kCount = 0;
+const kRefCount = 1;
+const kHasOutstanding = 2;
+
+const [immediateInfo, toggleImmediateRef] =
+ setImmediateCallback(processImmediate);
+
+const kRefed = Symbol('refed');
// Timeout values > TIMEOUT_MAX are set to 1.
const TIMEOUT_MAX = 2 ** 31 - 1;
@@ -675,76 +681,76 @@ ImmediateList.prototype.remove = function(item) {
};
// Create a single linked list instance only once at startup
-var immediateQueue = new ImmediateList();
+const immediateQueue = new ImmediateList();
+
+// If an uncaught exception was thrown during execution of immediateQueue,
+// this queue will store all remaining Immediates that need to run upon
+// resolution of all error handling (if process is still alive).
+const outstandingQueue = new ImmediateList();
function processImmediate() {
- var immediate = immediateQueue.head;
- var tail = immediateQueue.tail;
+ const queue = outstandingQueue.head !== null ?
+ outstandingQueue : immediateQueue;
+ var immediate = queue.head;
+ const tail = queue.tail;
// Clear the linked list early in case new `setImmediate()` calls occur while
// immediate callbacks are executed
- immediateQueue.head = immediateQueue.tail = null;
+ queue.head = queue.tail = null;
+
+ let count = 0;
+ let refCount = 0;
while (immediate !== null) {
- if (!immediate._onImmediate) {
- immediate = immediate._idleNext;
- continue;
- }
+ immediate._destroyed = true;
+
+ const asyncId = immediate[async_id_symbol];
+ emitBefore(asyncId, immediate[trigger_async_id_symbol]);
- // Save next in case `clearImmediate(immediate)` is called from callback
- var next = immediate._idleNext;
+ count++;
+ if (immediate[kRefed])
+ refCount++;
+ immediate[kRefed] = undefined;
- tryOnImmediate(immediate, tail);
+ tryOnImmediate(immediate, tail, count, refCount);
- // If `clearImmediate(immediate)` wasn't called from the callback, use the
- // `immediate`'s next item
- if (immediate._idleNext !== null)
- immediate = immediate._idleNext;
- else
- immediate = next;
+ emitAfter(asyncId);
+
+ immediate = immediate._idleNext;
}
-}
-process._immediateCallback = processImmediate;
+ immediateInfo[kCount] -= count;
+ immediateInfo[kRefCount] -= refCount;
+ immediateInfo[kHasOutstanding] = 0;
+}
// An optimization so that the try/finally only de-optimizes (since at least v8
// 4.7) what is in this smaller function.
-function tryOnImmediate(immediate, oldTail) {
+function tryOnImmediate(immediate, oldTail, count, refCount) {
var threw = true;
- emitBefore(immediate[async_id_symbol], immediate[trigger_async_id_symbol]);
try {
// make the actual call outside the try/finally to allow it to be optimized
runCallback(immediate);
threw = false;
} finally {
immediate._onImmediate = null;
- if (!threw)
- emitAfter(immediate[async_id_symbol]);
-
- if (!immediate._destroyed) {
- immediate._destroyed = true;
- scheduledImmediateCount[0]--;
- if (async_hook_fields[kDestroy] > 0) {
- emitDestroy(immediate[async_id_symbol]);
- }
+ if (async_hook_fields[kDestroy] > 0) {
+ emitDestroy(immediate[async_id_symbol]);
}
- if (threw && immediate._idleNext !== null) {
- // Handle any remaining on next tick, assuming we're still alive to do so.
- const curHead = immediateQueue.head;
- const next = immediate._idleNext;
- if (curHead !== null) {
- curHead._idlePrev = oldTail;
- oldTail._idleNext = curHead;
- next._idlePrev = null;
- immediateQueue.head = next;
- } else {
- immediateQueue.head = next;
- immediateQueue.tail = oldTail;
+ if (threw) {
+ immediateInfo[kCount] -= count;
+ immediateInfo[kRefCount] -= refCount;
+
+ if (immediate._idleNext !== null) {
+ // Handle any remaining Immediates after error handling has resolved,
+ // assuming we're still alive to do so.
+ outstandingQueue.head = immediate._idleNext;
+ outstandingQueue.tail = oldTail;
+ immediateInfo[kHasOutstanding] = 1;
}
- process.nextTick(processImmediate);
}
}
}
@@ -759,31 +765,51 @@ function runCallback(timer) {
}
-function Immediate(callback, args) {
- this._idleNext = null;
- this._idlePrev = null;
- // this must be set to null first to avoid function tracking
- // on the hidden class, revisit in V8 versions after 6.2
- this._onImmediate = null;
- this._onImmediate = callback;
- this._argv = args;
- this._destroyed = false;
+const Immediate = class Immediate {
+ constructor(callback, args) {
+ this._idleNext = null;
+ this._idlePrev = null;
+ // this must be set to null first to avoid function tracking
+ // on the hidden class, revisit in V8 versions after 6.2
+ this._onImmediate = null;
+ this._onImmediate = callback;
+ this._argv = args;
+ this._destroyed = false;
+ this[kRefed] = false;
+
+ this[async_id_symbol] = ++async_id_fields[kAsyncIdCounter];
+ this[trigger_async_id_symbol] = getDefaultTriggerAsyncId();
+ if (async_hook_fields[kInit] > 0) {
+ emitInit(this[async_id_symbol],
+ 'Immediate',
+ this[trigger_async_id_symbol],
+ this);
+ }
- this[async_id_symbol] = ++async_id_fields[kAsyncIdCounter];
- this[trigger_async_id_symbol] = getDefaultTriggerAsyncId();
- if (async_hook_fields[kInit] > 0) {
- emitInit(this[async_id_symbol],
- 'Immediate',
- this[trigger_async_id_symbol],
- this);
+ this.ref();
+ immediateInfo[kCount]++;
+
+ immediateQueue.append(this);
}
- if (scheduledImmediateCount[0] === 0)
- activateImmediateCheck();
- scheduledImmediateCount[0]++;
+ ref() {
+ if (this[kRefed] === false) {
+ this[kRefed] = true;
+ if (immediateInfo[kRefCount]++ === 0)
+ toggleImmediateRef(true);
+ }
+ return this;
+ }
- immediateQueue.append(this);
-}
+ unref() {
+ if (this[kRefed] === true) {
+ this[kRefed] = false;
+ if (--immediateInfo[kRefCount] === 0)
+ toggleImmediateRef(false);
+ }
+ return this;
+ }
+};
function setImmediate(callback, arg1, arg2, arg3) {
if (typeof callback !== 'function') {
@@ -823,15 +849,18 @@ exports.setImmediate = setImmediate;
exports.clearImmediate = function(immediate) {
- if (!immediate) return;
+ if (!immediate || immediate._destroyed)
+ return;
- if (!immediate._destroyed) {
- scheduledImmediateCount[0]--;
- immediate._destroyed = true;
+ immediateInfo[kCount]--;
+ immediate._destroyed = true;
- if (async_hook_fields[kDestroy] > 0) {
- emitDestroy(immediate[async_id_symbol]);
- }
+ if (immediate[kRefed] && --immediateInfo[kRefCount] === 0)
+ toggleImmediateRef(false);
+ immediate[kRefed] = undefined;
+
+ if (async_hook_fields[kDestroy] > 0) {
+ emitDestroy(immediate[async_id_symbol]);
}
immediate._onImmediate = null;
diff --git a/lib/url.js b/lib/url.js
index cb524fd9a87347..ab4b2b4647edd2 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -439,6 +439,24 @@ function validateHostname(self, rest, hostname) {
}
}
+// Escaped characters. Use empty strings to fill up unused entries.
+// Using Array is faster than Object/Map
+const escapedCodes = [
+ /*0 - 9*/ '', '', '', '', '', '', '', '', '', '%09',
+ /*10 - 19*/ '%0A', '', '', '%0D', '', '', '', '', '', '',
+ /*20 - 29*/ '', '', '', '', '', '', '', '', '', '',
+ /*30 - 39*/ '', '', '%20', '', '%22', '', '', '', '', '%27',
+ /*40 - 49*/ '', '', '', '', '', '', '', '', '', '',
+ /*50 - 59*/ '', '', '', '', '', '', '', '', '', '',
+ /*60 - 69*/ '%3C', '', '%3E', '', '', '', '', '', '', '',
+ /*70 - 79*/ '', '', '', '', '', '', '', '', '', '',
+ /*80 - 89*/ '', '', '', '', '', '', '', '', '', '',
+ /*90 - 99*/ '', '', '%5C', '', '%5E', '', '%60', '', '', '',
+ /*100 - 109*/ '', '', '', '', '', '', '', '', '', '',
+ /*110 - 119*/ '', '', '', '', '', '', '', '', '', '',
+ /*120 - 125*/ '', '', '', '%7B', '%7C', '%7D'
+];
+
// Automatically escape all delimiters and unwise characters from RFC 2396.
// Also escape single quotes in case of an XSS attack.
// Return the escaped string.
@@ -446,94 +464,14 @@ function autoEscapeStr(rest) {
var escaped = '';
var lastEscapedPos = 0;
for (var i = 0; i < rest.length; ++i) {
- // Manual switching is faster than using a Map/Object.
// `escaped` contains substring up to the last escaped character.
- switch (rest.charCodeAt(i)) {
- case 9: // '\t'
- // Concat if there are ordinary characters in the middle.
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%09';
- lastEscapedPos = i + 1;
- break;
- case 10: // '\n'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%0A';
- lastEscapedPos = i + 1;
- break;
- case 13: // '\r'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%0D';
- lastEscapedPos = i + 1;
- break;
- case 32: // ' '
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%20';
- lastEscapedPos = i + 1;
- break;
- case 34: // '"'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%22';
- lastEscapedPos = i + 1;
- break;
- case 39: // '\''
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%27';
- lastEscapedPos = i + 1;
- break;
- case 60: // '<'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%3C';
- lastEscapedPos = i + 1;
- break;
- case 62: // '>'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%3E';
- lastEscapedPos = i + 1;
- break;
- case 92: // '\\'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%5C';
- lastEscapedPos = i + 1;
- break;
- case 94: // '^'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%5E';
- lastEscapedPos = i + 1;
- break;
- case 96: // '`'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%60';
- lastEscapedPos = i + 1;
- break;
- case 123: // '{'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%7B';
- lastEscapedPos = i + 1;
- break;
- case 124: // '|'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%7C';
- lastEscapedPos = i + 1;
- break;
- case 125: // '}'
- if (i > lastEscapedPos)
- escaped += rest.slice(lastEscapedPos, i);
- escaped += '%7D';
- lastEscapedPos = i + 1;
- break;
+ var escapedChar = escapedCodes[rest.charCodeAt(i)];
+ if (escapedChar) {
+ // Concat if there are ordinary characters in the middle.
+ if (i > lastEscapedPos)
+ escaped += rest.slice(lastEscapedPos, i);
+ escaped += escapedChar;
+ lastEscapedPos = i + 1;
}
}
if (lastEscapedPos === 0) // Nothing has been escaped.
diff --git a/lib/vm.js b/lib/vm.js
index ecb675680e95d9..4da0d7c6c3c528 100644
--- a/lib/vm.js
+++ b/lib/vm.js
@@ -80,22 +80,23 @@ Script.prototype.runInNewContext = function(sandbox, options) {
return this.runInContext(context, options);
};
+function validateString(prop, propName) {
+ if (prop !== undefined && typeof prop !== 'string')
+ throw new errors.TypeError('ERR_INVALID_ARG_TYPE', propName,
+ 'string', prop);
+}
+
function getContextOptions(options) {
- const contextOptions = options ? {
- name: options.contextName,
- origin: options.contextOrigin
- } : {};
- if (contextOptions.name !== undefined &&
- typeof contextOptions.name !== 'string') {
- throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.contextName',
- 'string', contextOptions.name);
- }
- if (contextOptions.origin !== undefined &&
- typeof contextOptions.origin !== 'string') {
- throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.contextOrigin',
- 'string', contextOptions.origin);
+ if (options) {
+ const contextOptions = {
+ name: options.contextName,
+ origin: options.contextOrigin
+ };
+ validateString(contextOptions.name, 'options.contextName');
+ validateString(contextOptions.origin, 'options.contextOrigin');
+ return contextOptions;
}
- return contextOptions;
+ return {};
}
let defaultContextNameIndex = 1;
@@ -121,10 +122,7 @@ function createContext(sandbox, options) {
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.name',
'string', options.name);
}
- if (options.origin !== undefined && typeof options.origin !== 'string') {
- throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.origin',
- 'string', options.origin);
- }
+ validateString(options.origin, 'options.origin');
} else {
options = {
name: `VM Context ${defaultContextNameIndex++}`
diff --git a/node.gyp b/node.gyp
index 0e9db9a16eea9d..7da486ff6d8c7b 100644
--- a/node.gyp
+++ b/node.gyp
@@ -227,9 +227,9 @@
},
},
'conditions': [
- ['OS in "linux freebsd openbsd solaris android"', {
+ ['OS!="aix"', {
'ldflags': [
- '-Wl,--whole-archive,<(OBJ_DIR)/<(STATIC_LIB_PREFIX)'
+ '-Wl,--whole-archive,<(obj_dir)/<(STATIC_LIB_PREFIX)'
'<(node_core_target_name)<(STATIC_LIB_SUFFIX)',
'-Wl,--no-whole-archive',
],
@@ -308,6 +308,7 @@
'src/node_os.cc',
'src/node_platform.cc',
'src/node_perf.cc',
+ 'src/node_postmortem_metadata.cc',
'src/node_serdes.cc',
'src/node_trace_events.cc',
'src/node_url.cc',
@@ -773,10 +774,10 @@
{
'action_name': 'node_dtrace_provider_o',
'inputs': [
- '<(OBJ_DIR)/<(node_lib_target_name)/src/node_dtrace.o',
+ '<(obj_dir)/<(node_lib_target_name)/src/node_dtrace.o',
],
'outputs': [
- '<(OBJ_DIR)/<(node_lib_target_name)/src/node_dtrace_provider.o'
+ '<(obj_dir)/<(node_lib_target_name)/src/node_dtrace_provider.o'
],
'action': [ 'dtrace', '-G', '-xnolibs', '-s', 'src/node_provider.d',
'<@(_inputs)', '-o', '<@(_outputs)' ]
@@ -808,7 +809,7 @@
{
'action_name': 'node_dtrace_ustack_constants',
'inputs': [
- '<(V8_BASE)'
+ '<(v8_base)'
],
'outputs': [
'<(SHARED_INTERMEDIATE_DIR)/v8constants.h'
@@ -826,7 +827,7 @@
'<(SHARED_INTERMEDIATE_DIR)/v8constants.h'
],
'outputs': [
- '<(OBJ_DIR)/<(node_lib_target_name)/src/node_dtrace_ustack.o'
+ '<(obj_dir)/<(node_lib_target_name)/src/node_dtrace_ustack.o'
],
'conditions': [
[ 'target_arch=="ia32" or target_arch=="arm"', {
@@ -906,7 +907,7 @@
'type': 'executable',
'dependencies': [
- '<(node_core_target_name)',
+ '<(node_lib_target_name)',
'rename_node_bin_win',
'deps/gtest/gtest.gyp:gtest',
'node_js2c#host',
@@ -915,39 +916,6 @@
'node_dtrace_provider',
],
- 'variables': {
- 'OBJ_PATH': '<(OBJ_DIR)/<(node_lib_target_name)/src',
- 'OBJ_GEN_PATH': '<(OBJ_DIR)/<(node_lib_target_name)/gen',
- 'OBJ_TRACING_PATH': '<(OBJ_DIR)/<(node_lib_target_name)/src/tracing',
- 'OBJ_SUFFIX': 'o',
- 'OBJ_SEPARATOR': '/',
- 'conditions': [
- ['OS=="win"', {
- 'OBJ_SUFFIX': 'obj',
- }],
- ['GENERATOR=="ninja"', {
- 'OBJ_PATH': '<(OBJ_DIR)/src',
- 'OBJ_GEN_PATH': '<(OBJ_DIR)/gen',
- 'OBJ_TRACING_PATH': '<(OBJ_DIR)/src/tracing',
- 'OBJ_SEPARATOR': '/<(node_lib_target_name).',
- }, {
- 'conditions': [
- ['OS=="win"', {
- 'OBJ_PATH': '<(OBJ_DIR)/<(node_lib_target_name)',
- 'OBJ_GEN_PATH': '<(OBJ_DIR)/<(node_lib_target_name)',
- 'OBJ_TRACING_PATH': '<(OBJ_DIR)/<(node_lib_target_name)',
- }],
- ['OS=="aix"', {
- 'OBJ_PATH': '<(OBJ_DIR)/<(node_lib_target_name)/src',
- 'OBJ_GEN_PATH': '<(OBJ_DIR)/<(node_lib_target_name)/gen',
- 'OBJ_TRACING_PATH':
- '<(OBJ_DIR)/<(node_lib_target_name)/src/tracing',
- }],
- ]}
- ]
- ],
- },
-
'includes': [
'node.gypi'
],
@@ -964,127 +932,39 @@
'defines': [ 'NODE_WANT_INTERNALS=1' ],
'sources': [
- 'test/cctest/node_module_reg.cc',
'test/cctest/node_test_fixture.cc',
'test/cctest/test_aliased_buffer.cc',
'test/cctest/test_base64.cc',
+ 'test/cctest/test_node_postmortem_metadata.cc',
'test/cctest/test_environment.cc',
'test/cctest/test_util.cc',
'test/cctest/test_url.cc'
],
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)async_wrap.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)env.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_buffer.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_debug_options.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_i18n.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_perf.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_platform.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_url.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)util.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)string_bytes.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)string_search.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)stream_base.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_constants.<(OBJ_SUFFIX)',
- '<(OBJ_TRACING_PATH)<(OBJ_SEPARATOR)agent.<(OBJ_SUFFIX)',
- '<(OBJ_TRACING_PATH)<(OBJ_SEPARATOR)node_trace_buffer.<(OBJ_SUFFIX)',
- '<(OBJ_TRACING_PATH)<(OBJ_SEPARATOR)node_trace_writer.<(OBJ_SUFFIX)',
- '<(OBJ_TRACING_PATH)<(OBJ_SEPARATOR)trace_event.<(OBJ_SUFFIX)',
- '<(OBJ_GEN_PATH)<(OBJ_SEPARATOR)node_javascript.<(OBJ_SUFFIX)',
- ],
-
'conditions': [
[ 'node_use_openssl=="true"', {
- 'conditions': [
- ['node_target_type!="static_library"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_crypto.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_crypto_bio.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_crypto_clienthello.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)tls_wrap.<(OBJ_SUFFIX)',
- ],
- }],
- ],
'defines': [
'HAVE_OPENSSL=1',
],
}],
[ 'node_use_perfctr=="true"', {
'defines': [ 'HAVE_PERFCTR=1' ],
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_counters.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)'
- 'node_win32_perfctr_provider.<(OBJ_SUFFIX)',
- ],
}],
['v8_enable_inspector==1', {
'sources': [
'test/cctest/test_inspector_socket.cc',
'test/cctest/test_inspector_socket_server.cc'
],
- 'conditions': [
- ['node_target_type!="static_library"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)inspector_agent.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)inspector_io.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)inspector_js_api.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)inspector_socket.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)inspector_socket_server.<(OBJ_SUFFIX)',
- ],
- }],
- ],
'defines': [
'HAVE_INSPECTOR=1',
],
- }],
- [ 'node_use_dtrace=="true" and node_target_type!="static_library"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_dtrace.<(OBJ_SUFFIX)',
- ],
- 'conditions': [
- ['OS!="mac" and OS!="linux"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_dtrace_provider.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_dtrace_ustack.<(OBJ_SUFFIX)',
- ]
- }],
- ['OS=="linux"', {
- 'libraries': [
- '<(SHARED_INTERMEDIATE_DIR)<(OBJ_SEPARATOR)'
- 'node_dtrace_provider.<(OBJ_SUFFIX)',
- ]
- }],
- ],
- }, {
- 'conditions': [
- [ 'node_use_etw=="true" and OS=="win"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)node_dtrace.<(OBJ_SUFFIX)',
- '<(OBJ_PATH)<(OBJ_SEPARATOR)'
- 'node_win32_etw_provider.<(OBJ_SUFFIX)',
- ],
- }]
- ]
- }],
- [ 'OS=="win" and node_target_type!="static_library"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)backtrace_win32.<(OBJ_SUFFIX)',
- ],
}, {
- 'conditions': [
- ['node_target_type!="static_library"', {
- 'libraries': [
- '<(OBJ_PATH)<(OBJ_SEPARATOR)backtrace_posix.<(OBJ_SUFFIX)',
- ],
- }],
- ],
+ 'defines': [ 'HAVE_INSPECTOR=0' ]
}],
['OS=="solaris"', {
'ldflags': [ '-I<(SHARED_INTERMEDIATE_DIR)' ]
}],
- ]
+ ],
}
], # end targets
diff --git a/node.gypi b/node.gypi
index 386601906fbe4a..82953ee9ff9af4 100644
--- a/node.gypi
+++ b/node.gypi
@@ -99,7 +99,7 @@
[ 'force_load=="true"', {
'xcode_settings': {
'OTHER_LDFLAGS': [
- '-Wl,-force_load,<(V8_BASE)',
+ '-Wl,-force_load,<(v8_base)',
],
},
}],
@@ -107,6 +107,32 @@
}],
[ 'node_shared_zlib=="false"', {
'dependencies': [ 'deps/zlib/zlib.gyp:zlib' ],
+ 'conditions': [
+ [ 'force_load=="true"', {
+ 'xcode_settings': {
+ 'OTHER_LDFLAGS': [
+ '-Wl,-force_load,<(PRODUCT_DIR)/<(STATIC_LIB_PREFIX)'
+ 'zlib<(STATIC_LIB_SUFFIX)',
+ ],
+ },
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/WHOLEARCHIVE:<(PRODUCT_DIR)\\lib\\zlib<(STATIC_LIB_SUFFIX)',
+ ],
+ },
+ },
+ 'conditions': [
+ ['OS!="aix" and node_shared=="false"', {
+ 'ldflags': [
+ '-Wl,--whole-archive,<(obj_dir)/deps/zlib/<(STATIC_LIB_PREFIX)'
+ 'zlib<(STATIC_LIB_SUFFIX)',
+ '-Wl,--no-whole-archive',
+ ],
+ }],
+ ],
+ }],
+ ],
}],
[ 'node_shared_http_parser=="false"', {
@@ -119,6 +145,32 @@
[ 'node_shared_libuv=="false"', {
'dependencies': [ 'deps/uv/uv.gyp:libuv' ],
+ 'conditions': [
+ [ 'force_load=="true"', {
+ 'xcode_settings': {
+ 'OTHER_LDFLAGS': [
+ '-Wl,-force_load,<(PRODUCT_DIR)/<(STATIC_LIB_PREFIX)'
+ 'uv<(STATIC_LIB_SUFFIX)',
+ ],
+ },
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/WHOLEARCHIVE:<(PRODUCT_DIR)\\lib\\libuv<(STATIC_LIB_SUFFIX)',
+ ],
+ },
+ },
+ 'conditions': [
+ ['OS!="aix" and node_shared=="false"', {
+ 'ldflags': [
+ '-Wl,--whole-archive,<(obj_dir)/deps/uv/<(STATIC_LIB_PREFIX)'
+ 'uv<(STATIC_LIB_SUFFIX)',
+ '-Wl,--no-whole-archive',
+ ],
+ }],
+ ],
+ }],
+ ],
}],
[ 'node_shared_nghttp2=="false"', {
@@ -154,7 +206,7 @@
{
'action_name': 'expfile',
'inputs': [
- '<(OBJ_DIR)'
+ '<(obj_dir)'
],
'outputs': [
'<(PRODUCT_DIR)/node.exp'
@@ -186,13 +238,13 @@
[ '(OS=="freebsd" or OS=="linux") and node_shared=="false"'
' and coverage=="false" and force_load=="true"', {
'ldflags': [ '-Wl,-z,noexecstack',
- '-Wl,--whole-archive <(V8_BASE)',
+ '-Wl,--whole-archive <(v8_base)',
'-Wl,--no-whole-archive' ]
}],
[ '(OS=="freebsd" or OS=="linux") and node_shared=="false"'
' and coverage=="true" and force_load=="true"', {
'ldflags': [ '-Wl,-z,noexecstack',
- '-Wl,--whole-archive <(V8_BASE)',
+ '-Wl,--whole-archive <(v8_base)',
'-Wl,--no-whole-archive',
'--coverage',
'-g',
@@ -237,15 +289,21 @@
[ 'force_load=="true"', {
'xcode_settings': {
'OTHER_LDFLAGS': [
- '-Wl,-force_load,<(PRODUCT_DIR)/<(OPENSSL_PRODUCT)',
+ '-Wl,-force_load,<(PRODUCT_DIR)/<(openssl_product)',
],
},
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/WHOLEARCHIVE:<(PRODUCT_DIR)\\lib\\<(openssl_product)',
+ ],
+ },
+ },
'conditions': [
['OS in "linux freebsd" and node_shared=="false"', {
'ldflags': [
'-Wl,--whole-archive,'
- '<(OBJ_DIR)/deps/openssl/'
- '<(OPENSSL_PRODUCT)',
+ '<(obj_dir)/deps/openssl/<(openssl_product)',
'-Wl,--no-whole-archive',
],
}],
diff --git a/src/async_wrap.cc b/src/async_wrap.cc
index c9dfc40c0ca52d..5e9dc69f87839f 100644
--- a/src/async_wrap.cc
+++ b/src/async_wrap.cc
@@ -128,7 +128,7 @@ RetainedObjectInfo* WrapperInfo(uint16_t class_id, Local wrapper) {
CHECK_GT(object->InternalFieldCount(), 0);
AsyncWrap* wrap = Unwrap(object);
- CHECK_NE(nullptr, wrap);
+ if (wrap == nullptr) return nullptr; // ClearWrap() already called.
return new RetainedAsyncInfo(class_id, wrap);
}
diff --git a/src/base_object.h b/src/base_object.h
index 0998920f49dd15..965683d029e43e 100644
--- a/src/base_object.h
+++ b/src/base_object.h
@@ -65,6 +65,12 @@ class BaseObject {
static inline void WeakCallback(
const v8::WeakCallbackInfo& data);
+ // persistent_handle_ needs to be at a fixed offset from the start of the
+ // class because it is used by src/node_postmortem_metadata.cc to calculate
+ // offsets and generate debug symbols for BaseObject, which assumes that the
+ // position of members in memory are predictable. For more information please
+ // refer to `doc/guides/node-postmortem-support.md`
+ friend int GenDebugSymbols();
v8::Persistent persistent_handle_;
Environment* env_;
};
diff --git a/src/connection_wrap.cc b/src/connection_wrap.cc
index 8de77f361dcde4..a6cf67ceee2477 100644
--- a/src/connection_wrap.cc
+++ b/src/connection_wrap.cc
@@ -3,6 +3,7 @@
#include "connect_wrap.h"
#include "env-inl.h"
#include "pipe_wrap.h"
+#include "stream_base-inl.h"
#include "stream_wrap.h"
#include "tcp_wrap.h"
#include "util-inl.h"
diff --git a/src/env-inl.h b/src/env-inl.h
index bf919644dfbe49..37d1cf172ea14b 100644
--- a/src/env-inl.h
+++ b/src/env-inl.h
@@ -217,29 +217,51 @@ inline bool Environment::AsyncCallbackScope::in_makecallback() const {
return env_->makecallback_cntr_ > 1;
}
-inline Environment::TickInfo::TickInfo() {
- for (int i = 0; i < kFieldsCount; ++i)
- fields_[i] = 0;
-}
+inline Environment::ImmediateInfo::ImmediateInfo(v8::Isolate* isolate)
+ : fields_(isolate, kFieldsCount) {}
-inline uint32_t* Environment::TickInfo::fields() {
+inline AliasedBuffer&
+ Environment::ImmediateInfo::fields() {
return fields_;
}
-inline int Environment::TickInfo::fields_count() const {
- return kFieldsCount;
+inline uint32_t Environment::ImmediateInfo::count() const {
+ return fields_[kCount];
+}
+
+inline uint32_t Environment::ImmediateInfo::ref_count() const {
+ return fields_[kRefCount];
+}
+
+inline bool Environment::ImmediateInfo::has_outstanding() const {
+ return fields_[kHasOutstanding] == 1;
+}
+
+inline void Environment::ImmediateInfo::count_inc(uint32_t increment) {
+ fields_[kCount] = fields_[kCount] + increment;
}
-inline uint32_t Environment::TickInfo::index() const {
- return fields_[kIndex];
+inline void Environment::ImmediateInfo::count_dec(uint32_t decrement) {
+ fields_[kCount] = fields_[kCount] - decrement;
}
-inline uint32_t Environment::TickInfo::length() const {
- return fields_[kLength];
+inline void Environment::ImmediateInfo::ref_count_inc(uint32_t increment) {
+ fields_[kRefCount] = fields_[kRefCount] + increment;
}
-inline void Environment::TickInfo::set_index(uint32_t value) {
- fields_[kIndex] = value;
+inline void Environment::ImmediateInfo::ref_count_dec(uint32_t decrement) {
+ fields_[kRefCount] = fields_[kRefCount] - decrement;
+}
+
+inline Environment::TickInfo::TickInfo(v8::Isolate* isolate)
+ : fields_(isolate, kFieldsCount) {}
+
+inline AliasedBuffer& Environment::TickInfo::fields() {
+ return fields_;
+}
+
+inline bool Environment::TickInfo::has_scheduled() const {
+ return fields_[kHasScheduled] == 1;
}
inline void Environment::AssignToContext(v8::Local context,
@@ -277,13 +299,14 @@ inline Environment::Environment(IsolateData* isolate_data,
v8::Local context)
: isolate_(context->GetIsolate()),
isolate_data_(isolate_data),
+ immediate_info_(context->GetIsolate()),
+ tick_info_(context->GetIsolate()),
timer_base_(uv_now(isolate_data->event_loop())),
printed_error_(false),
trace_sync_io_(false),
abort_on_uncaught_exception_(false),
emit_napi_warning_(true),
makecallback_cntr_(0),
- scheduled_immediate_count_(isolate_, 1),
should_abort_on_uncaught_toggle_(isolate_, 1),
#if HAVE_INSPECTOR
inspector_agent_(new inspector::Agent(this)),
@@ -370,6 +393,10 @@ inline Environment::AsyncHooks* Environment::async_hooks() {
return &async_hooks_;
}
+inline Environment::ImmediateInfo* Environment::immediate_info() {
+ return &immediate_info_;
+}
+
inline Environment::TickInfo* Environment::tick_info() {
return &tick_info_;
}
@@ -499,23 +526,34 @@ inline void Environment::set_fs_stats_field_array(double* fields) {
fs_stats_field_array_ = fields;
}
-inline AliasedBuffer&
-Environment::scheduled_immediate_count() {
- return scheduled_immediate_count_;
-}
-
-void Environment::SetImmediate(native_immediate_callback cb,
+void Environment::CreateImmediate(native_immediate_callback cb,
void* data,
- v8::Local obj) {
+ v8::Local obj,
+ bool ref) {
native_immediate_callbacks_.push_back({
cb,
data,
- std::unique_ptr>(
- obj.IsEmpty() ? nullptr : new v8::Persistent(isolate_, obj))
+ std::unique_ptr>(obj.IsEmpty() ?
+ nullptr : new v8::Persistent(isolate_, obj)),
+ ref
});
- if (scheduled_immediate_count_[0] == 0)
- ActivateImmediateCheck();
- scheduled_immediate_count_[0] = scheduled_immediate_count_[0] + 1;
+ immediate_info()->count_inc(1);
+}
+
+void Environment::SetImmediate(native_immediate_callback cb,
+ void* data,
+ v8::Local obj) {
+ CreateImmediate(cb, data, obj, true);
+
+ if (immediate_info()->ref_count() == 0)
+ ToggleImmediateRef(true);
+ immediate_info()->ref_count_inc(1);
+}
+
+void Environment::SetUnrefImmediate(native_immediate_callback cb,
+ void* data,
+ v8::Local obj) {
+ CreateImmediate(cb, data, obj, false);
}
inline performance::performance_state* Environment::performance_state() {
diff --git a/src/env.cc b/src/env.cc
index 902429e18a7e74..17cdbbb79f9af1 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -80,6 +80,8 @@ void Environment::Start(int argc,
uv_idle_init(event_loop(), immediate_idle_handle());
+ uv_check_start(immediate_check_handle(), CheckImmediate);
+
// Inform V8's CPU profiler when we're idle. The profiler is sampling-based
// but not all samples are created equal; mark the wall clock time spent in
// epoll_wait() and friends so profiling tools can filter it out. The samples
@@ -272,55 +274,57 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type,
void Environment::RunAndClearNativeImmediates() {
size_t count = native_immediate_callbacks_.size();
if (count > 0) {
+ size_t ref_count = 0;
std::vector list;
native_immediate_callbacks_.swap(list);
for (const auto& cb : list) {
cb.cb_(this, cb.data_);
if (cb.keep_alive_)
cb.keep_alive_->Reset();
+ if (cb.refed_)
+ ref_count++;
}
#ifdef DEBUG
- CHECK_GE(scheduled_immediate_count_[0], count);
+ CHECK_GE(immediate_info()->count(), count);
#endif
- scheduled_immediate_count_[0] = scheduled_immediate_count_[0] - count;
- }
-}
-
-static bool MaybeStopImmediate(Environment* env) {
- if (env->scheduled_immediate_count()[0] == 0) {
- uv_check_stop(env->immediate_check_handle());
- uv_idle_stop(env->immediate_idle_handle());
- return true;
+ immediate_info()->count_dec(count);
+ immediate_info()->ref_count_dec(ref_count);
}
- return false;
}
void Environment::CheckImmediate(uv_check_t* handle) {
Environment* env = Environment::from_immediate_check_handle(handle);
- HandleScope scope(env->isolate());
- Context::Scope context_scope(env->context());
- if (MaybeStopImmediate(env))
+ if (env->immediate_info()->count() == 0)
return;
- env->RunAndClearNativeImmediates();
+ HandleScope scope(env->isolate());
+ Context::Scope context_scope(env->context());
- MakeCallback(env->isolate(),
- env->process_object(),
- env->immediate_callback_string(),
- 0,
- nullptr,
- {0, 0}).ToLocalChecked();
+ env->RunAndClearNativeImmediates();
- MaybeStopImmediate(env);
+ do {
+ MakeCallback(env->isolate(),
+ env->process_object(),
+ env->immediate_callback_function(),
+ 0,
+ nullptr,
+ {0, 0}).ToLocalChecked();
+ } while (env->immediate_info()->has_outstanding());
+
+ if (env->immediate_info()->ref_count() == 0)
+ env->ToggleImmediateRef(false);
}
-void Environment::ActivateImmediateCheck() {
- uv_check_start(&immediate_check_handle_, CheckImmediate);
- // Idle handle is needed only to stop the event loop from blocking in poll.
- uv_idle_start(&immediate_idle_handle_, [](uv_idle_t*){ });
+void Environment::ToggleImmediateRef(bool ref) {
+ if (ref) {
+ // Idle handle is needed only to stop the event loop from blocking in poll.
+ uv_idle_start(immediate_idle_handle(), [](uv_idle_t*){ });
+ } else {
+ uv_idle_stop(immediate_idle_handle());
+ }
}
void Environment::AsyncHooks::grow_async_ids_stack() {
diff --git a/src/env.h b/src/env.h
index 5ebd56a3fff633..638753db727136 100644
--- a/src/env.h
+++ b/src/env.h
@@ -158,7 +158,6 @@ class ModuleWrap;
V(homedir_string, "homedir") \
V(hostmaster_string, "hostmaster") \
V(ignore_string, "ignore") \
- V(immediate_callback_string, "_immediateCallback") \
V(infoaccess_string, "infoAccess") \
V(inherit_string, "inherit") \
V(input_string, "input") \
@@ -215,6 +214,7 @@ class ModuleWrap;
V(owner_string, "owner") \
V(parse_error_string, "Parse Error") \
V(path_string, "path") \
+ V(pending_handle_string, "pendingHandle") \
V(pbkdf2_error_string, "PBKDF2 Error") \
V(pid_string, "pid") \
V(pipe_string, "pipe") \
@@ -288,6 +288,7 @@ class ModuleWrap;
V(http2ping_constructor_template, v8::ObjectTemplate) \
V(http2stream_constructor_template, v8::ObjectTemplate) \
V(http2settings_constructor_template, v8::ObjectTemplate) \
+ V(immediate_callback_function, v8::Function) \
V(inspector_console_api_object, v8::Object) \
V(pbkdf2_constructor_template, v8::ObjectTemplate) \
V(pipe_constructor_template, v8::FunctionTemplate) \
@@ -450,25 +451,50 @@ class Environment {
DISALLOW_COPY_AND_ASSIGN(AsyncCallbackScope);
};
+ class ImmediateInfo {
+ public:
+ inline AliasedBuffer& fields();
+ inline uint32_t count() const;
+ inline uint32_t ref_count() const;
+ inline bool has_outstanding() const;
+
+ inline void count_inc(uint32_t increment);
+ inline void count_dec(uint32_t decrement);
+
+ inline void ref_count_inc(uint32_t increment);
+ inline void ref_count_dec(uint32_t decrement);
+
+ private:
+ friend class Environment; // So we can call the constructor.
+ inline explicit ImmediateInfo(v8::Isolate* isolate);
+
+ enum Fields {
+ kCount,
+ kRefCount,
+ kHasOutstanding,
+ kFieldsCount
+ };
+
+ AliasedBuffer fields_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImmediateInfo);
+ };
+
class TickInfo {
public:
- inline uint32_t* fields();
- inline int fields_count() const;
- inline uint32_t index() const;
- inline uint32_t length() const;
- inline void set_index(uint32_t value);
+ inline AliasedBuffer& fields();
+ inline bool has_scheduled() const;
private:
friend class Environment; // So we can call the constructor.
- inline TickInfo();
+ inline explicit TickInfo(v8::Isolate* isolate);
enum Fields {
- kIndex,
- kLength,
+ kHasScheduled,
kFieldsCount
};
- uint32_t fields_[kFieldsCount];
+ AliasedBuffer fields_;
DISALLOW_COPY_AND_ASSIGN(TickInfo);
};
@@ -533,6 +559,7 @@ class Environment {
inline void FinishHandleCleanup(uv_handle_t* handle);
inline AsyncHooks* async_hooks();
+ inline ImmediateInfo* immediate_info();
inline TickInfo* tick_info();
inline uint64_t timer_base() const;
@@ -580,8 +607,6 @@ class Environment {
inline double* fs_stats_field_array() const;
inline void set_fs_stats_field_array(double* fields);
- inline AliasedBuffer& scheduled_immediate_count();
-
inline performance::performance_state* performance_state();
inline std::map* performance_marks();
@@ -660,8 +685,12 @@ class Environment {
inline void SetImmediate(native_immediate_callback cb,
void* data,
v8::Local obj = v8::Local());
+ inline void SetUnrefImmediate(native_immediate_callback cb,
+ void* data,
+ v8::Local obj =
+ v8::Local());
// This needs to be available for the JS-land setImmediate().
- void ActivateImmediateCheck();
+ void ToggleImmediateRef(bool ref);
class ShouldNotAbortOnUncaughtScope {
public:
@@ -678,6 +707,11 @@ class Environment {
static inline Environment* ForAsyncHooks(AsyncHooks* hooks);
private:
+ inline void CreateImmediate(native_immediate_callback cb,
+ void* data,
+ v8::Local obj,
+ bool ref);
+
inline void ThrowError(v8::Local (*fun)(v8::Local),
const char* errmsg);
@@ -689,6 +723,7 @@ class Environment {
uv_check_t idle_check_handle_;
AsyncHooks async_hooks_;
+ ImmediateInfo immediate_info_;
TickInfo tick_info_;
const uint64_t timer_base_;
bool printed_error_;
@@ -698,7 +733,6 @@ class Environment {
size_t makecallback_cntr_;
std::vector destroy_async_id_list_;
- AliasedBuffer scheduled_immediate_count_;
AliasedBuffer should_abort_on_uncaught_toggle_;
int should_not_abort_scope_counter_ = 0;
@@ -710,6 +744,13 @@ class Environment {
std::unique_ptr inspector_agent_;
#endif
+ // handle_wrap_queue_ and req_wrap_queue_ needs to be at a fixed offset from
+ // the start of the class because it is used by
+ // src/node_postmortem_metadata.cc to calculate offsets and generate debug
+ // symbols for Environment, which assumes that the position of members in
+ // memory are predictable. For more information please refer to
+ // `doc/guides/node-postmortem-support.md`
+ friend int GenDebugSymbols();
HandleWrapQueue handle_wrap_queue_;
ReqWrapQueue req_wrap_queue_;
ListHead> keep_alive_;
+ bool refed_;
};
std::vector native_immediate_callbacks_;
void RunAndClearNativeImmediates();
diff --git a/src/handle_wrap.h b/src/handle_wrap.h
index 29e4f364603bda..19fd36891a2fed 100644
--- a/src/handle_wrap.h
+++ b/src/handle_wrap.h
@@ -81,6 +81,13 @@ class HandleWrap : public AsyncWrap {
friend class Environment;
friend void GetActiveHandles(const v8::FunctionCallbackInfo&);
static void OnClose(uv_handle_t* handle);
+
+ // handle_wrap_queue_ needs to be at a fixed offset from the start of the
+ // class because it is used by src/node_postmortem_metadata.cc to calculate
+ // offsets and generate debug symbols for HandleWrap, which assumes that the
+ // position of members in memory are predictable. For more information please
+ // refer to `doc/guides/node-postmortem-support.md`
+ friend int GenDebugSymbols();
ListNode handle_wrap_queue_;
enum { kInitialized, kClosing, kClosingWithCallback, kClosed } state_;
uv_handle_t* const handle_;
diff --git a/src/js_stream.cc b/src/js_stream.cc
index 7d1115f12ac3e2..9e67a2094ded89 100644
--- a/src/js_stream.cc
+++ b/src/js_stream.cc
@@ -25,9 +25,6 @@ JSStream::JSStream(Environment* env, Local