feat: add github ci
This commit is contained in:
@@ -0,0 +1,132 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on: [push, pull_request, workflow_dispatch]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-20.04]
|
||||||
|
sourcemod-version: [1.11-dev]
|
||||||
|
libuv-version: [v1.44.2]
|
||||||
|
include:
|
||||||
|
- os: ubuntu-20.04
|
||||||
|
target-archs: x86,x86_64
|
||||||
|
sdks: sdk2013
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install Linux packages
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -yq --no-install-recommends g++-multilib
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
path: extension
|
||||||
|
|
||||||
|
- name: Checkout SourceMod
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: alliedmodders/sourcemod
|
||||||
|
ref: ${{ matrix.sourcemod-version }}
|
||||||
|
path: sourcemod
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Checkout AMBuild
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: alliedmodders/ambuild
|
||||||
|
path: ambuild
|
||||||
|
|
||||||
|
- name: Checkout sm-ext-common
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: srcdslab/sm-ext-common
|
||||||
|
path: sourcemod/extensions/sm-ext-common
|
||||||
|
|
||||||
|
- name: Checkout libuv
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: libuv/libuv
|
||||||
|
ref: ${{ matrix.libuv-version }}
|
||||||
|
path: libuv
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install sourcemod dependencies
|
||||||
|
run: |
|
||||||
|
bash sourcemod/tools/checkout-deps.sh -m -s ${{ matrix.sdks }}
|
||||||
|
|
||||||
|
- name: Install AMBuild
|
||||||
|
uses: BSFishy/pip-action@v1
|
||||||
|
with:
|
||||||
|
packages: ./ambuild
|
||||||
|
|
||||||
|
- name: Build libuv
|
||||||
|
run: |
|
||||||
|
cd libuv
|
||||||
|
sh autogen.sh
|
||||||
|
./configure --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static
|
||||||
|
make -j 8
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
working-directory: extension
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
BREAKPAD_SYMBOL_SERVER: ${{ secrets.BREAKPAD_SYMBOL_SERVER }}
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
python ../configure.py --enable-optimize --targets=${{ matrix.target-archs }} --sdks=${{ matrix.sdks }}
|
||||||
|
ambuild
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: ${{ runner.os }}
|
||||||
|
path: extension/build/package
|
||||||
|
|
||||||
|
|
||||||
|
release:
|
||||||
|
name: Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
run: |
|
||||||
|
version=`echo $GITHUB_REF | sed "s/refs\/tags\///"`
|
||||||
|
ls -Rall
|
||||||
|
if [ -d "./Linux/" ]; then
|
||||||
|
cd ./Linux/
|
||||||
|
tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz -T <(\ls -1)
|
||||||
|
cd -
|
||||||
|
fi
|
||||||
|
if [ -d "./macOS/" ]; then
|
||||||
|
cd ./macOS/
|
||||||
|
tar -czf ../${{ github.event.repository.name }}-${version}-mac.tar.gz -T <(\ls -1)
|
||||||
|
cd -
|
||||||
|
fi
|
||||||
|
if [ -d "./Windows/" ]; then
|
||||||
|
cd ./Windows/
|
||||||
|
tar -czf ../${{ github.event.repository.name }}-${version}-windows.tar.gz -T <(\ls -1)
|
||||||
|
cd -
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: '*.tar.gz'
|
||||||
|
tag: ${{ github.ref }}
|
||||||
|
file_glob: true
|
||||||
+18
-6
@@ -30,11 +30,6 @@ class SDK(object):
|
|||||||
WinOnly = ['windows']
|
WinOnly = ['windows']
|
||||||
WinLinux = ['windows', 'linux']
|
WinLinux = ['windows', 'linux']
|
||||||
WinLinuxMac = ['windows', 'linux', 'mac']
|
WinLinuxMac = ['windows', 'linux', 'mac']
|
||||||
CSGO = {
|
|
||||||
'windows': ['x86'],
|
|
||||||
'linux': ['x86', 'x86_64'],
|
|
||||||
'mac': ['x86_64']
|
|
||||||
}
|
|
||||||
|
|
||||||
PossibleSDKs = {
|
PossibleSDKs = {
|
||||||
'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'),
|
'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'),
|
||||||
@@ -85,6 +80,7 @@ class ExtensionConfig(object):
|
|||||||
self.versionlib = None
|
self.versionlib = None
|
||||||
self.all_targets = []
|
self.all_targets = []
|
||||||
self.target_archs = set()
|
self.target_archs = set()
|
||||||
|
self.libuv_root = None
|
||||||
|
|
||||||
|
|
||||||
if builder.options.targets:
|
if builder.options.targets:
|
||||||
@@ -183,6 +179,22 @@ class ExtensionConfig(object):
|
|||||||
raise Exception('Could not find a source copy of Metamod:Source')
|
raise Exception('Could not find a source copy of Metamod:Source')
|
||||||
self.mms_root = Normalize(self.mms_root)
|
self.mms_root = Normalize(self.mms_root)
|
||||||
|
|
||||||
|
if builder.options.libuv_path:
|
||||||
|
self.libuv_root = builder.options.libuv_path
|
||||||
|
else:
|
||||||
|
self.libuv_root = ResolveEnvPath('LIBUVSOURCE144', 'libuv-1.44')
|
||||||
|
if not self.libuv_root:
|
||||||
|
self.libuv_root = ResolveEnvPath('LIBUVSOURCE_DEV', 'libuv-source')
|
||||||
|
if not self.libuv_root:
|
||||||
|
self.libuv_root = ResolveEnvPath('LIBUVSOURCE_DEV', 'libuv-central')
|
||||||
|
if not self.libuv_root:
|
||||||
|
self.libuv_root = ResolveEnvPath('LIBUVSOURCE_DEV', 'libuv')
|
||||||
|
|
||||||
|
if not self.libuv_root or not os.path.isdir(self.libuv_root):
|
||||||
|
raise Exception('Could not find a source copy of libuv')
|
||||||
|
self.libuv_root = Normalize(self.libuv_root)
|
||||||
|
|
||||||
|
|
||||||
def configure(self):
|
def configure(self):
|
||||||
if not set(self.target_archs).issubset(['x86', 'x86_64']):
|
if not set(self.target_archs).issubset(['x86', 'x86_64']):
|
||||||
raise Exception('Unknown target architecture: {0}'.format(self.target_archs))
|
raise Exception('Unknown target architecture: {0}'.format(self.target_archs))
|
||||||
@@ -451,7 +463,7 @@ class ExtensionConfig(object):
|
|||||||
os.path.join(self.sm_root, 'sourcepawn', 'include'),
|
os.path.join(self.sm_root, 'sourcepawn', 'include'),
|
||||||
os.path.join(self.sm_root, 'public', 'amtl', 'amtl'),
|
os.path.join(self.sm_root, 'public', 'amtl', 'amtl'),
|
||||||
os.path.join(self.sm_root, 'public', 'amtl'),
|
os.path.join(self.sm_root, 'public', 'amtl'),
|
||||||
os.path.join(context.currentSourcePath, 'libuv', 'include'),
|
os.path.join(self.libuv_root, 'include'),
|
||||||
]
|
]
|
||||||
return compiler
|
return compiler
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -d libuv ]]; then
|
|
||||||
exit 0;
|
|
||||||
fi;
|
|
||||||
|
|
||||||
git clone https://github.com/libuv/libuv.git --recursive
|
|
||||||
cd libuv
|
|
||||||
sh autogen.sh
|
|
||||||
./configure --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" --disable-shared --enable-static
|
|
||||||
make -j 8
|
|
||||||
cp -R include/ ../../extension/libuv/
|
|
||||||
cp .libs/libuv.a ../../extension/libuv/
|
|
||||||
+2
-4
@@ -28,6 +28,8 @@ parser.options.add_argument('--mms-path', type=str, dest='mms_path', default=Non
|
|||||||
help='Path to Metamod:Source')
|
help='Path to Metamod:Source')
|
||||||
parser.options.add_argument('--sm-path', type=str, dest='sm_path', default=None,
|
parser.options.add_argument('--sm-path', type=str, dest='sm_path', default=None,
|
||||||
help='Path to SourceMod')
|
help='Path to SourceMod')
|
||||||
|
parser.options.add_argument('--libuv-path', type=str, dest='libuv_path', default=None,
|
||||||
|
help='Path to libuv')
|
||||||
parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug',
|
parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug',
|
||||||
help='Enable debugging symbols')
|
help='Enable debugging symbols')
|
||||||
parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt',
|
parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt',
|
||||||
@@ -39,7 +41,3 @@ parser.options.add_argument('--targets', type=str, dest='targets', default=None,
|
|||||||
help="Override the target architecture (use commas to separate multiple targets).")
|
help="Override the target architecture (use commas to separate multiple targets).")
|
||||||
|
|
||||||
parser.Configure()
|
parser.Configure()
|
||||||
|
|
||||||
# Run libuv compilation and copy files to corresponding folders
|
|
||||||
os.chmod('../build_libuv.sh', 0o755)
|
|
||||||
subprocess.call("../build_libuv.sh")
|
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ for cxx in builder.targets:
|
|||||||
binary.compiler.linkflags += ['ws2_32.lib']
|
binary.compiler.linkflags += ['ws2_32.lib']
|
||||||
|
|
||||||
binary.compiler.postlink += [
|
binary.compiler.postlink += [
|
||||||
os.path.join(builder.sourcePath, 'extension', 'libuv', 'libuv.a')
|
os.path.join(SM.libuv_root, '.libs', 'libuv.a'),
|
||||||
]
|
]
|
||||||
|
|
||||||
binary.sources += [
|
binary.sources += [
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
*
|
|
||||||
!.gitignore
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_AIX_H
|
|
||||||
#define UV_AIX_H
|
|
||||||
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
int fs_fd; \
|
|
||||||
|
|
||||||
#define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
uv__io_t event_watcher; \
|
|
||||||
char *dir_filename; \
|
|
||||||
|
|
||||||
#endif /* UV_AIX_H */
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1995, 1999
|
|
||||||
* Berkeley Software Design, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _IFADDRS_H_
|
|
||||||
#define _IFADDRS_H_
|
|
||||||
|
|
||||||
struct ifaddrs {
|
|
||||||
struct ifaddrs *ifa_next;
|
|
||||||
char *ifa_name;
|
|
||||||
unsigned int ifa_flags;
|
|
||||||
struct sockaddr *ifa_addr;
|
|
||||||
struct sockaddr *ifa_netmask;
|
|
||||||
struct sockaddr *ifa_dstaddr;
|
|
||||||
void *ifa_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This may have been defined in <net/if.h>. Note that if <net/if.h> is
|
|
||||||
* to be included it must be included before this header file.
|
|
||||||
*/
|
|
||||||
#ifndef ifa_broadaddr
|
|
||||||
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
extern int getifaddrs(struct ifaddrs **ifap);
|
|
||||||
extern void freeifaddrs(struct ifaddrs *ifa);
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_BSD_H
|
|
||||||
#define UV_BSD_H
|
|
||||||
|
|
||||||
#define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
uv__io_t event_watcher; \
|
|
||||||
|
|
||||||
#define UV_IO_PRIVATE_PLATFORM_FIELDS \
|
|
||||||
int rcount; \
|
|
||||||
int wcount; \
|
|
||||||
|
|
||||||
#define UV_HAVE_KQUEUE 1
|
|
||||||
|
|
||||||
#endif /* UV_BSD_H */
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_DARWIN_H
|
|
||||||
#define UV_DARWIN_H
|
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
|
||||||
# include <mach/mach.h>
|
|
||||||
# include <mach/task.h>
|
|
||||||
# include <mach/semaphore.h>
|
|
||||||
# include <TargetConditionals.h>
|
|
||||||
# define UV_PLATFORM_SEM_T semaphore_t
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UV_IO_PRIVATE_PLATFORM_FIELDS \
|
|
||||||
int rcount; \
|
|
||||||
int wcount; \
|
|
||||||
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
uv_thread_t cf_thread; \
|
|
||||||
void* _cf_reserved; \
|
|
||||||
void* cf_state; \
|
|
||||||
uv_mutex_t cf_mutex; \
|
|
||||||
uv_sem_t cf_sem; \
|
|
||||||
void* cf_signals[2]; \
|
|
||||||
|
|
||||||
#define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
uv__io_t event_watcher; \
|
|
||||||
char* realpath; \
|
|
||||||
int realpath_len; \
|
|
||||||
int cf_flags; \
|
|
||||||
uv_async_t* cf_cb; \
|
|
||||||
void* cf_events[2]; \
|
|
||||||
void* cf_member[2]; \
|
|
||||||
int cf_error; \
|
|
||||||
uv_mutex_t cf_mutex; \
|
|
||||||
|
|
||||||
#define UV_STREAM_PRIVATE_PLATFORM_FIELDS \
|
|
||||||
void* select; \
|
|
||||||
|
|
||||||
#define UV_HAVE_KQUEUE 1
|
|
||||||
|
|
||||||
#endif /* UV_DARWIN_H */
|
|
||||||
@@ -1,448 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_ERRNO_H_
|
|
||||||
#define UV_ERRNO_H_
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#if EDOM > 0
|
|
||||||
# define UV__ERR(x) (-(x))
|
|
||||||
#else
|
|
||||||
# define UV__ERR(x) (x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UV__EOF (-4095)
|
|
||||||
#define UV__UNKNOWN (-4094)
|
|
||||||
|
|
||||||
#define UV__EAI_ADDRFAMILY (-3000)
|
|
||||||
#define UV__EAI_AGAIN (-3001)
|
|
||||||
#define UV__EAI_BADFLAGS (-3002)
|
|
||||||
#define UV__EAI_CANCELED (-3003)
|
|
||||||
#define UV__EAI_FAIL (-3004)
|
|
||||||
#define UV__EAI_FAMILY (-3005)
|
|
||||||
#define UV__EAI_MEMORY (-3006)
|
|
||||||
#define UV__EAI_NODATA (-3007)
|
|
||||||
#define UV__EAI_NONAME (-3008)
|
|
||||||
#define UV__EAI_OVERFLOW (-3009)
|
|
||||||
#define UV__EAI_SERVICE (-3010)
|
|
||||||
#define UV__EAI_SOCKTYPE (-3011)
|
|
||||||
#define UV__EAI_BADHINTS (-3013)
|
|
||||||
#define UV__EAI_PROTOCOL (-3014)
|
|
||||||
|
|
||||||
/* Only map to the system errno on non-Windows platforms. It's apparently
|
|
||||||
* a fairly common practice for Windows programmers to redefine errno codes.
|
|
||||||
*/
|
|
||||||
#if defined(E2BIG) && !defined(_WIN32)
|
|
||||||
# define UV__E2BIG UV__ERR(E2BIG)
|
|
||||||
#else
|
|
||||||
# define UV__E2BIG (-4093)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EACCES) && !defined(_WIN32)
|
|
||||||
# define UV__EACCES UV__ERR(EACCES)
|
|
||||||
#else
|
|
||||||
# define UV__EACCES (-4092)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EADDRINUSE) && !defined(_WIN32)
|
|
||||||
# define UV__EADDRINUSE UV__ERR(EADDRINUSE)
|
|
||||||
#else
|
|
||||||
# define UV__EADDRINUSE (-4091)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EADDRNOTAVAIL) && !defined(_WIN32)
|
|
||||||
# define UV__EADDRNOTAVAIL UV__ERR(EADDRNOTAVAIL)
|
|
||||||
#else
|
|
||||||
# define UV__EADDRNOTAVAIL (-4090)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EAFNOSUPPORT) && !defined(_WIN32)
|
|
||||||
# define UV__EAFNOSUPPORT UV__ERR(EAFNOSUPPORT)
|
|
||||||
#else
|
|
||||||
# define UV__EAFNOSUPPORT (-4089)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EAGAIN) && !defined(_WIN32)
|
|
||||||
# define UV__EAGAIN UV__ERR(EAGAIN)
|
|
||||||
#else
|
|
||||||
# define UV__EAGAIN (-4088)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EALREADY) && !defined(_WIN32)
|
|
||||||
# define UV__EALREADY UV__ERR(EALREADY)
|
|
||||||
#else
|
|
||||||
# define UV__EALREADY (-4084)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EBADF) && !defined(_WIN32)
|
|
||||||
# define UV__EBADF UV__ERR(EBADF)
|
|
||||||
#else
|
|
||||||
# define UV__EBADF (-4083)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EBUSY) && !defined(_WIN32)
|
|
||||||
# define UV__EBUSY UV__ERR(EBUSY)
|
|
||||||
#else
|
|
||||||
# define UV__EBUSY (-4082)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ECANCELED) && !defined(_WIN32)
|
|
||||||
# define UV__ECANCELED UV__ERR(ECANCELED)
|
|
||||||
#else
|
|
||||||
# define UV__ECANCELED (-4081)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ECHARSET) && !defined(_WIN32)
|
|
||||||
# define UV__ECHARSET UV__ERR(ECHARSET)
|
|
||||||
#else
|
|
||||||
# define UV__ECHARSET (-4080)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ECONNABORTED) && !defined(_WIN32)
|
|
||||||
# define UV__ECONNABORTED UV__ERR(ECONNABORTED)
|
|
||||||
#else
|
|
||||||
# define UV__ECONNABORTED (-4079)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ECONNREFUSED) && !defined(_WIN32)
|
|
||||||
# define UV__ECONNREFUSED UV__ERR(ECONNREFUSED)
|
|
||||||
#else
|
|
||||||
# define UV__ECONNREFUSED (-4078)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ECONNRESET) && !defined(_WIN32)
|
|
||||||
# define UV__ECONNRESET UV__ERR(ECONNRESET)
|
|
||||||
#else
|
|
||||||
# define UV__ECONNRESET (-4077)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EDESTADDRREQ) && !defined(_WIN32)
|
|
||||||
# define UV__EDESTADDRREQ UV__ERR(EDESTADDRREQ)
|
|
||||||
#else
|
|
||||||
# define UV__EDESTADDRREQ (-4076)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EEXIST) && !defined(_WIN32)
|
|
||||||
# define UV__EEXIST UV__ERR(EEXIST)
|
|
||||||
#else
|
|
||||||
# define UV__EEXIST (-4075)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EFAULT) && !defined(_WIN32)
|
|
||||||
# define UV__EFAULT UV__ERR(EFAULT)
|
|
||||||
#else
|
|
||||||
# define UV__EFAULT (-4074)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EHOSTUNREACH) && !defined(_WIN32)
|
|
||||||
# define UV__EHOSTUNREACH UV__ERR(EHOSTUNREACH)
|
|
||||||
#else
|
|
||||||
# define UV__EHOSTUNREACH (-4073)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EINTR) && !defined(_WIN32)
|
|
||||||
# define UV__EINTR UV__ERR(EINTR)
|
|
||||||
#else
|
|
||||||
# define UV__EINTR (-4072)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EINVAL) && !defined(_WIN32)
|
|
||||||
# define UV__EINVAL UV__ERR(EINVAL)
|
|
||||||
#else
|
|
||||||
# define UV__EINVAL (-4071)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EIO) && !defined(_WIN32)
|
|
||||||
# define UV__EIO UV__ERR(EIO)
|
|
||||||
#else
|
|
||||||
# define UV__EIO (-4070)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EISCONN) && !defined(_WIN32)
|
|
||||||
# define UV__EISCONN UV__ERR(EISCONN)
|
|
||||||
#else
|
|
||||||
# define UV__EISCONN (-4069)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EISDIR) && !defined(_WIN32)
|
|
||||||
# define UV__EISDIR UV__ERR(EISDIR)
|
|
||||||
#else
|
|
||||||
# define UV__EISDIR (-4068)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ELOOP) && !defined(_WIN32)
|
|
||||||
# define UV__ELOOP UV__ERR(ELOOP)
|
|
||||||
#else
|
|
||||||
# define UV__ELOOP (-4067)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EMFILE) && !defined(_WIN32)
|
|
||||||
# define UV__EMFILE UV__ERR(EMFILE)
|
|
||||||
#else
|
|
||||||
# define UV__EMFILE (-4066)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EMSGSIZE) && !defined(_WIN32)
|
|
||||||
# define UV__EMSGSIZE UV__ERR(EMSGSIZE)
|
|
||||||
#else
|
|
||||||
# define UV__EMSGSIZE (-4065)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENAMETOOLONG) && !defined(_WIN32)
|
|
||||||
# define UV__ENAMETOOLONG UV__ERR(ENAMETOOLONG)
|
|
||||||
#else
|
|
||||||
# define UV__ENAMETOOLONG (-4064)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENETDOWN) && !defined(_WIN32)
|
|
||||||
# define UV__ENETDOWN UV__ERR(ENETDOWN)
|
|
||||||
#else
|
|
||||||
# define UV__ENETDOWN (-4063)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENETUNREACH) && !defined(_WIN32)
|
|
||||||
# define UV__ENETUNREACH UV__ERR(ENETUNREACH)
|
|
||||||
#else
|
|
||||||
# define UV__ENETUNREACH (-4062)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENFILE) && !defined(_WIN32)
|
|
||||||
# define UV__ENFILE UV__ERR(ENFILE)
|
|
||||||
#else
|
|
||||||
# define UV__ENFILE (-4061)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOBUFS) && !defined(_WIN32)
|
|
||||||
# define UV__ENOBUFS UV__ERR(ENOBUFS)
|
|
||||||
#else
|
|
||||||
# define UV__ENOBUFS (-4060)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENODEV) && !defined(_WIN32)
|
|
||||||
# define UV__ENODEV UV__ERR(ENODEV)
|
|
||||||
#else
|
|
||||||
# define UV__ENODEV (-4059)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOENT) && !defined(_WIN32)
|
|
||||||
# define UV__ENOENT UV__ERR(ENOENT)
|
|
||||||
#else
|
|
||||||
# define UV__ENOENT (-4058)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOMEM) && !defined(_WIN32)
|
|
||||||
# define UV__ENOMEM UV__ERR(ENOMEM)
|
|
||||||
#else
|
|
||||||
# define UV__ENOMEM (-4057)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENONET) && !defined(_WIN32)
|
|
||||||
# define UV__ENONET UV__ERR(ENONET)
|
|
||||||
#else
|
|
||||||
# define UV__ENONET (-4056)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOSPC) && !defined(_WIN32)
|
|
||||||
# define UV__ENOSPC UV__ERR(ENOSPC)
|
|
||||||
#else
|
|
||||||
# define UV__ENOSPC (-4055)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOSYS) && !defined(_WIN32)
|
|
||||||
# define UV__ENOSYS UV__ERR(ENOSYS)
|
|
||||||
#else
|
|
||||||
# define UV__ENOSYS (-4054)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTCONN) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTCONN UV__ERR(ENOTCONN)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTCONN (-4053)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTDIR) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTDIR UV__ERR(ENOTDIR)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTDIR (-4052)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTEMPTY) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTEMPTY UV__ERR(ENOTEMPTY)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTEMPTY (-4051)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTSOCK) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTSOCK UV__ERR(ENOTSOCK)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTSOCK (-4050)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTSUP) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTSUP UV__ERR(ENOTSUP)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTSUP (-4049)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EPERM) && !defined(_WIN32)
|
|
||||||
# define UV__EPERM UV__ERR(EPERM)
|
|
||||||
#else
|
|
||||||
# define UV__EPERM (-4048)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EPIPE) && !defined(_WIN32)
|
|
||||||
# define UV__EPIPE UV__ERR(EPIPE)
|
|
||||||
#else
|
|
||||||
# define UV__EPIPE (-4047)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EPROTO) && !defined(_WIN32)
|
|
||||||
# define UV__EPROTO UV__ERR(EPROTO)
|
|
||||||
#else
|
|
||||||
# define UV__EPROTO (-4046)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EPROTONOSUPPORT) && !defined(_WIN32)
|
|
||||||
# define UV__EPROTONOSUPPORT UV__ERR(EPROTONOSUPPORT)
|
|
||||||
#else
|
|
||||||
# define UV__EPROTONOSUPPORT (-4045)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EPROTOTYPE) && !defined(_WIN32)
|
|
||||||
# define UV__EPROTOTYPE UV__ERR(EPROTOTYPE)
|
|
||||||
#else
|
|
||||||
# define UV__EPROTOTYPE (-4044)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EROFS) && !defined(_WIN32)
|
|
||||||
# define UV__EROFS UV__ERR(EROFS)
|
|
||||||
#else
|
|
||||||
# define UV__EROFS (-4043)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ESHUTDOWN) && !defined(_WIN32)
|
|
||||||
# define UV__ESHUTDOWN UV__ERR(ESHUTDOWN)
|
|
||||||
#else
|
|
||||||
# define UV__ESHUTDOWN (-4042)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ESPIPE) && !defined(_WIN32)
|
|
||||||
# define UV__ESPIPE UV__ERR(ESPIPE)
|
|
||||||
#else
|
|
||||||
# define UV__ESPIPE (-4041)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ESRCH) && !defined(_WIN32)
|
|
||||||
# define UV__ESRCH UV__ERR(ESRCH)
|
|
||||||
#else
|
|
||||||
# define UV__ESRCH (-4040)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ETIMEDOUT) && !defined(_WIN32)
|
|
||||||
# define UV__ETIMEDOUT UV__ERR(ETIMEDOUT)
|
|
||||||
#else
|
|
||||||
# define UV__ETIMEDOUT (-4039)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ETXTBSY) && !defined(_WIN32)
|
|
||||||
# define UV__ETXTBSY UV__ERR(ETXTBSY)
|
|
||||||
#else
|
|
||||||
# define UV__ETXTBSY (-4038)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EXDEV) && !defined(_WIN32)
|
|
||||||
# define UV__EXDEV UV__ERR(EXDEV)
|
|
||||||
#else
|
|
||||||
# define UV__EXDEV (-4037)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EFBIG) && !defined(_WIN32)
|
|
||||||
# define UV__EFBIG UV__ERR(EFBIG)
|
|
||||||
#else
|
|
||||||
# define UV__EFBIG (-4036)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOPROTOOPT) && !defined(_WIN32)
|
|
||||||
# define UV__ENOPROTOOPT UV__ERR(ENOPROTOOPT)
|
|
||||||
#else
|
|
||||||
# define UV__ENOPROTOOPT (-4035)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ERANGE) && !defined(_WIN32)
|
|
||||||
# define UV__ERANGE UV__ERR(ERANGE)
|
|
||||||
#else
|
|
||||||
# define UV__ERANGE (-4034)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENXIO) && !defined(_WIN32)
|
|
||||||
# define UV__ENXIO UV__ERR(ENXIO)
|
|
||||||
#else
|
|
||||||
# define UV__ENXIO (-4033)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EMLINK) && !defined(_WIN32)
|
|
||||||
# define UV__EMLINK UV__ERR(EMLINK)
|
|
||||||
#else
|
|
||||||
# define UV__EMLINK (-4032)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* EHOSTDOWN is not visible on BSD-like systems when _POSIX_C_SOURCE is
|
|
||||||
* defined. Fortunately, its value is always 64 so it's possible albeit
|
|
||||||
* icky to hard-code it.
|
|
||||||
*/
|
|
||||||
#if defined(EHOSTDOWN) && !defined(_WIN32)
|
|
||||||
# define UV__EHOSTDOWN UV__ERR(EHOSTDOWN)
|
|
||||||
#elif defined(__APPLE__) || \
|
|
||||||
defined(__DragonFly__) || \
|
|
||||||
defined(__FreeBSD__) || \
|
|
||||||
defined(__FreeBSD_kernel__) || \
|
|
||||||
defined(__NetBSD__) || \
|
|
||||||
defined(__OpenBSD__)
|
|
||||||
# define UV__EHOSTDOWN (-64)
|
|
||||||
#else
|
|
||||||
# define UV__EHOSTDOWN (-4031)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EREMOTEIO) && !defined(_WIN32)
|
|
||||||
# define UV__EREMOTEIO UV__ERR(EREMOTEIO)
|
|
||||||
#else
|
|
||||||
# define UV__EREMOTEIO (-4030)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ENOTTY) && !defined(_WIN32)
|
|
||||||
# define UV__ENOTTY UV__ERR(ENOTTY)
|
|
||||||
#else
|
|
||||||
# define UV__ENOTTY (-4029)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EFTYPE) && !defined(_WIN32)
|
|
||||||
# define UV__EFTYPE UV__ERR(EFTYPE)
|
|
||||||
#else
|
|
||||||
# define UV__EFTYPE (-4028)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(EILSEQ) && !defined(_WIN32)
|
|
||||||
# define UV__EILSEQ UV__ERR(EILSEQ)
|
|
||||||
#else
|
|
||||||
# define UV__EILSEQ (-4027)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* UV_ERRNO_H_ */
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_LINUX_H
|
|
||||||
#define UV_LINUX_H
|
|
||||||
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
uv__io_t inotify_read_watcher; \
|
|
||||||
void* inotify_watchers; \
|
|
||||||
int inotify_fd; \
|
|
||||||
|
|
||||||
#define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
void* watchers[2]; \
|
|
||||||
int wd; \
|
|
||||||
|
|
||||||
#endif /* UV_LINUX_H */
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/* Copyright libuv project contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_MVS_H
|
|
||||||
#define UV_MVS_H
|
|
||||||
|
|
||||||
#define UV_PLATFORM_SEM_T long
|
|
||||||
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
void* ep; \
|
|
||||||
|
|
||||||
#define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
char rfis_rftok[8]; \
|
|
||||||
|
|
||||||
#endif /* UV_MVS_H */
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/* Copyright libuv project contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_POSIX_H
|
|
||||||
#define UV_POSIX_H
|
|
||||||
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
struct pollfd* poll_fds; \
|
|
||||||
size_t poll_fds_used; \
|
|
||||||
size_t poll_fds_size; \
|
|
||||||
unsigned char poll_fds_iterating; \
|
|
||||||
|
|
||||||
#endif /* UV_POSIX_H */
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
// ISO C9x compliant stdint.h for Microsoft Visual Studio
|
|
||||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
|
||||||
//
|
|
||||||
// Copyright (c) 2006-2008 Alexander Chemeris
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the distribution.
|
|
||||||
//
|
|
||||||
// 3. The name of the author may be used to endorse or promote products
|
|
||||||
// derived from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef _MSC_VER // [
|
|
||||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
|
||||||
#endif // _MSC_VER ]
|
|
||||||
|
|
||||||
#ifndef _MSC_STDINT_H_ // [
|
|
||||||
#define _MSC_STDINT_H_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
|
|
||||||
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
|
|
||||||
// or compiler give many errors like this:
|
|
||||||
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
# include <wchar.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Define _W64 macros to mark types changing their size, like intptr_t.
|
|
||||||
#ifndef _W64
|
|
||||||
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
|
|
||||||
# define _W64 __w64
|
|
||||||
# else
|
|
||||||
# define _W64
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.1 Integer types
|
|
||||||
|
|
||||||
// 7.18.1.1 Exact-width integer types
|
|
||||||
|
|
||||||
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
|
|
||||||
// realize that, e.g. char has the same size as __int8
|
|
||||||
// so we give up on __intX for them.
|
|
||||||
#if (_MSC_VER < 1300)
|
|
||||||
typedef signed char int8_t;
|
|
||||||
typedef signed short int16_t;
|
|
||||||
typedef signed int int32_t;
|
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
typedef unsigned short uint16_t;
|
|
||||||
typedef unsigned int uint32_t;
|
|
||||||
#else
|
|
||||||
typedef signed __int8 int8_t;
|
|
||||||
typedef signed __int16 int16_t;
|
|
||||||
typedef signed __int32 int32_t;
|
|
||||||
typedef unsigned __int8 uint8_t;
|
|
||||||
typedef unsigned __int16 uint16_t;
|
|
||||||
typedef unsigned __int32 uint32_t;
|
|
||||||
#endif
|
|
||||||
typedef signed __int64 int64_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.1.2 Minimum-width integer types
|
|
||||||
typedef int8_t int_least8_t;
|
|
||||||
typedef int16_t int_least16_t;
|
|
||||||
typedef int32_t int_least32_t;
|
|
||||||
typedef int64_t int_least64_t;
|
|
||||||
typedef uint8_t uint_least8_t;
|
|
||||||
typedef uint16_t uint_least16_t;
|
|
||||||
typedef uint32_t uint_least32_t;
|
|
||||||
typedef uint64_t uint_least64_t;
|
|
||||||
|
|
||||||
// 7.18.1.3 Fastest minimum-width integer types
|
|
||||||
typedef int8_t int_fast8_t;
|
|
||||||
typedef int16_t int_fast16_t;
|
|
||||||
typedef int32_t int_fast32_t;
|
|
||||||
typedef int64_t int_fast64_t;
|
|
||||||
typedef uint8_t uint_fast8_t;
|
|
||||||
typedef uint16_t uint_fast16_t;
|
|
||||||
typedef uint32_t uint_fast32_t;
|
|
||||||
typedef uint64_t uint_fast64_t;
|
|
||||||
|
|
||||||
// 7.18.1.4 Integer types capable of holding object pointers
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
typedef signed __int64 intptr_t;
|
|
||||||
typedef unsigned __int64 uintptr_t;
|
|
||||||
#else // _WIN64 ][
|
|
||||||
typedef _W64 signed int intptr_t;
|
|
||||||
typedef _W64 unsigned int uintptr_t;
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
// 7.18.1.5 Greatest-width integer types
|
|
||||||
typedef int64_t intmax_t;
|
|
||||||
typedef uint64_t uintmax_t;
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.2 Limits of specified-width integer types
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
|
|
||||||
|
|
||||||
// 7.18.2.1 Limits of exact-width integer types
|
|
||||||
#define INT8_MIN ((int8_t)_I8_MIN)
|
|
||||||
#define INT8_MAX _I8_MAX
|
|
||||||
#define INT16_MIN ((int16_t)_I16_MIN)
|
|
||||||
#define INT16_MAX _I16_MAX
|
|
||||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
|
||||||
#define INT32_MAX _I32_MAX
|
|
||||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
|
||||||
#define INT64_MAX _I64_MAX
|
|
||||||
#define UINT8_MAX _UI8_MAX
|
|
||||||
#define UINT16_MAX _UI16_MAX
|
|
||||||
#define UINT32_MAX _UI32_MAX
|
|
||||||
#define UINT64_MAX _UI64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.2 Limits of minimum-width integer types
|
|
||||||
#define INT_LEAST8_MIN INT8_MIN
|
|
||||||
#define INT_LEAST8_MAX INT8_MAX
|
|
||||||
#define INT_LEAST16_MIN INT16_MIN
|
|
||||||
#define INT_LEAST16_MAX INT16_MAX
|
|
||||||
#define INT_LEAST32_MIN INT32_MIN
|
|
||||||
#define INT_LEAST32_MAX INT32_MAX
|
|
||||||
#define INT_LEAST64_MIN INT64_MIN
|
|
||||||
#define INT_LEAST64_MAX INT64_MAX
|
|
||||||
#define UINT_LEAST8_MAX UINT8_MAX
|
|
||||||
#define UINT_LEAST16_MAX UINT16_MAX
|
|
||||||
#define UINT_LEAST32_MAX UINT32_MAX
|
|
||||||
#define UINT_LEAST64_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.3 Limits of fastest minimum-width integer types
|
|
||||||
#define INT_FAST8_MIN INT8_MIN
|
|
||||||
#define INT_FAST8_MAX INT8_MAX
|
|
||||||
#define INT_FAST16_MIN INT16_MIN
|
|
||||||
#define INT_FAST16_MAX INT16_MAX
|
|
||||||
#define INT_FAST32_MIN INT32_MIN
|
|
||||||
#define INT_FAST32_MAX INT32_MAX
|
|
||||||
#define INT_FAST64_MIN INT64_MIN
|
|
||||||
#define INT_FAST64_MAX INT64_MAX
|
|
||||||
#define UINT_FAST8_MAX UINT8_MAX
|
|
||||||
#define UINT_FAST16_MAX UINT16_MAX
|
|
||||||
#define UINT_FAST32_MAX UINT32_MAX
|
|
||||||
#define UINT_FAST64_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.2.4 Limits of integer types capable of holding object pointers
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
# define INTPTR_MIN INT64_MIN
|
|
||||||
# define INTPTR_MAX INT64_MAX
|
|
||||||
# define UINTPTR_MAX UINT64_MAX
|
|
||||||
#else // _WIN64 ][
|
|
||||||
# define INTPTR_MIN INT32_MIN
|
|
||||||
# define INTPTR_MAX INT32_MAX
|
|
||||||
# define UINTPTR_MAX UINT32_MAX
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
// 7.18.2.5 Limits of greatest-width integer types
|
|
||||||
#define INTMAX_MIN INT64_MIN
|
|
||||||
#define INTMAX_MAX INT64_MAX
|
|
||||||
#define UINTMAX_MAX UINT64_MAX
|
|
||||||
|
|
||||||
// 7.18.3 Limits of other integer types
|
|
||||||
|
|
||||||
#ifdef _WIN64 // [
|
|
||||||
# define PTRDIFF_MIN _I64_MIN
|
|
||||||
# define PTRDIFF_MAX _I64_MAX
|
|
||||||
#else // _WIN64 ][
|
|
||||||
# define PTRDIFF_MIN _I32_MIN
|
|
||||||
# define PTRDIFF_MAX _I32_MAX
|
|
||||||
#endif // _WIN64 ]
|
|
||||||
|
|
||||||
#define SIG_ATOMIC_MIN INT_MIN
|
|
||||||
#define SIG_ATOMIC_MAX INT_MAX
|
|
||||||
|
|
||||||
#ifndef SIZE_MAX // [
|
|
||||||
# ifdef _WIN64 // [
|
|
||||||
# define SIZE_MAX _UI64_MAX
|
|
||||||
# else // _WIN64 ][
|
|
||||||
# define SIZE_MAX _UI32_MAX
|
|
||||||
# endif // _WIN64 ]
|
|
||||||
#endif // SIZE_MAX ]
|
|
||||||
|
|
||||||
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
|
|
||||||
#ifndef WCHAR_MIN // [
|
|
||||||
# define WCHAR_MIN 0
|
|
||||||
#endif // WCHAR_MIN ]
|
|
||||||
#ifndef WCHAR_MAX // [
|
|
||||||
# define WCHAR_MAX _UI16_MAX
|
|
||||||
#endif // WCHAR_MAX ]
|
|
||||||
|
|
||||||
#define WINT_MIN 0
|
|
||||||
#define WINT_MAX _UI16_MAX
|
|
||||||
|
|
||||||
#endif // __STDC_LIMIT_MACROS ]
|
|
||||||
|
|
||||||
|
|
||||||
// 7.18.4 Limits of other integer types
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
|
|
||||||
|
|
||||||
// 7.18.4.1 Macros for minimum-width integer constants
|
|
||||||
|
|
||||||
#define INT8_C(val) val##i8
|
|
||||||
#define INT16_C(val) val##i16
|
|
||||||
#define INT32_C(val) val##i32
|
|
||||||
#define INT64_C(val) val##i64
|
|
||||||
|
|
||||||
#define UINT8_C(val) val##ui8
|
|
||||||
#define UINT16_C(val) val##ui16
|
|
||||||
#define UINT32_C(val) val##ui32
|
|
||||||
#define UINT64_C(val) val##ui64
|
|
||||||
|
|
||||||
// 7.18.4.2 Macros for greatest-width integer constants
|
|
||||||
#define INTMAX_C INT64_C
|
|
||||||
#define UINTMAX_C UINT64_C
|
|
||||||
|
|
||||||
#endif // __STDC_CONSTANT_MACROS ]
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _MSC_STDINT_H_ ]
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_SUNOS_H
|
|
||||||
#define UV_SUNOS_H
|
|
||||||
|
|
||||||
#include <sys/port.h>
|
|
||||||
#include <port.h>
|
|
||||||
|
|
||||||
/* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c,
|
|
||||||
* add the fs_event fields even when this version of SunOS doesn't support
|
|
||||||
* file watching.
|
|
||||||
*/
|
|
||||||
#define UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
uv__io_t fs_event_watcher; \
|
|
||||||
int fs_fd; \
|
|
||||||
|
|
||||||
#if defined(PORT_SOURCE_FILE)
|
|
||||||
|
|
||||||
# define UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
file_obj_t fo; \
|
|
||||||
int fd; \
|
|
||||||
|
|
||||||
#endif /* defined(PORT_SOURCE_FILE) */
|
|
||||||
|
|
||||||
#endif /* UV_SUNOS_H */
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is private to libuv. It provides common functionality to both
|
|
||||||
* Windows and Unix backends.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_THREADPOOL_H_
|
|
||||||
#define UV_THREADPOOL_H_
|
|
||||||
|
|
||||||
struct uv__work {
|
|
||||||
void (*work)(struct uv__work *w);
|
|
||||||
void (*done)(struct uv__work *w, int status);
|
|
||||||
struct uv_loop_s* loop;
|
|
||||||
void* wq[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* UV_THREADPOOL_H_ */
|
|
||||||
@@ -1,768 +0,0 @@
|
|||||||
/*-
|
|
||||||
* Copyright 2002 Niels Provos <[email protected]>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_TREE_H_
|
|
||||||
#define UV_TREE_H_
|
|
||||||
|
|
||||||
#ifndef UV__UNUSED
|
|
||||||
# if __GNUC__
|
|
||||||
# define UV__UNUSED __attribute__((unused))
|
|
||||||
# else
|
|
||||||
# define UV__UNUSED
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file defines data structures for different types of trees:
|
|
||||||
* splay trees and red-black trees.
|
|
||||||
*
|
|
||||||
* A splay tree is a self-organizing data structure. Every operation
|
|
||||||
* on the tree causes a splay to happen. The splay moves the requested
|
|
||||||
* node to the root of the tree and partly rebalances it.
|
|
||||||
*
|
|
||||||
* This has the benefit that request locality causes faster lookups as
|
|
||||||
* the requested nodes move to the top of the tree. On the other hand,
|
|
||||||
* every lookup causes memory writes.
|
|
||||||
*
|
|
||||||
* The Balance Theorem bounds the total access time for m operations
|
|
||||||
* and n inserts on an initially empty tree as O((m + n)lg n). The
|
|
||||||
* amortized cost for a sequence of m accesses to a splay tree is O(lg n);
|
|
||||||
*
|
|
||||||
* A red-black tree is a binary search tree with the node color as an
|
|
||||||
* extra attribute. It fulfills a set of conditions:
|
|
||||||
* - every search path from the root to a leaf consists of the
|
|
||||||
* same number of black nodes,
|
|
||||||
* - each red node (except for the root) has a black parent,
|
|
||||||
* - each leaf node is black.
|
|
||||||
*
|
|
||||||
* Every operation on a red-black tree is bounded as O(lg n).
|
|
||||||
* The maximum height of a red-black tree is 2lg (n+1).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SPLAY_HEAD(name, type) \
|
|
||||||
struct name { \
|
|
||||||
struct type *sph_root; /* root of the tree */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SPLAY_INITIALIZER(root) \
|
|
||||||
{ NULL }
|
|
||||||
|
|
||||||
#define SPLAY_INIT(root) do { \
|
|
||||||
(root)->sph_root = NULL; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define SPLAY_ENTRY(type) \
|
|
||||||
struct { \
|
|
||||||
struct type *spe_left; /* left element */ \
|
|
||||||
struct type *spe_right; /* right element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SPLAY_LEFT(elm, field) (elm)->field.spe_left
|
|
||||||
#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right
|
|
||||||
#define SPLAY_ROOT(head) (head)->sph_root
|
|
||||||
#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL)
|
|
||||||
|
|
||||||
/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */
|
|
||||||
#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \
|
|
||||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \
|
|
||||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
|
||||||
(head)->sph_root = tmp; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \
|
|
||||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \
|
|
||||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
|
||||||
(head)->sph_root = tmp; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define SPLAY_LINKLEFT(head, tmp, field) do { \
|
|
||||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
|
||||||
tmp = (head)->sph_root; \
|
|
||||||
(head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define SPLAY_LINKRIGHT(head, tmp, field) do { \
|
|
||||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
|
||||||
tmp = (head)->sph_root; \
|
|
||||||
(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \
|
|
||||||
SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \
|
|
||||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
/* Generates prototypes and inline functions */
|
|
||||||
|
|
||||||
#define SPLAY_PROTOTYPE(name, type, field, cmp) \
|
|
||||||
void name##_SPLAY(struct name *, struct type *); \
|
|
||||||
void name##_SPLAY_MINMAX(struct name *, int); \
|
|
||||||
struct type *name##_SPLAY_INSERT(struct name *, struct type *); \
|
|
||||||
struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \
|
|
||||||
\
|
|
||||||
/* Finds the node with the same key as elm */ \
|
|
||||||
static __inline struct type * \
|
|
||||||
name##_SPLAY_FIND(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
if (SPLAY_EMPTY(head)) \
|
|
||||||
return(NULL); \
|
|
||||||
name##_SPLAY(head, elm); \
|
|
||||||
if ((cmp)(elm, (head)->sph_root) == 0) \
|
|
||||||
return (head->sph_root); \
|
|
||||||
return (NULL); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static __inline struct type * \
|
|
||||||
name##_SPLAY_NEXT(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
name##_SPLAY(head, elm); \
|
|
||||||
if (SPLAY_RIGHT(elm, field) != NULL) { \
|
|
||||||
elm = SPLAY_RIGHT(elm, field); \
|
|
||||||
while (SPLAY_LEFT(elm, field) != NULL) { \
|
|
||||||
elm = SPLAY_LEFT(elm, field); \
|
|
||||||
} \
|
|
||||||
} else \
|
|
||||||
elm = NULL; \
|
|
||||||
return (elm); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static __inline struct type * \
|
|
||||||
name##_SPLAY_MIN_MAX(struct name *head, int val) \
|
|
||||||
{ \
|
|
||||||
name##_SPLAY_MINMAX(head, val); \
|
|
||||||
return (SPLAY_ROOT(head)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main splay operation.
|
|
||||||
* Moves node close to the key of elm to top
|
|
||||||
*/
|
|
||||||
#define SPLAY_GENERATE(name, type, field, cmp) \
|
|
||||||
struct type * \
|
|
||||||
name##_SPLAY_INSERT(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
if (SPLAY_EMPTY(head)) { \
|
|
||||||
SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \
|
|
||||||
} else { \
|
|
||||||
int __comp; \
|
|
||||||
name##_SPLAY(head, elm); \
|
|
||||||
__comp = (cmp)(elm, (head)->sph_root); \
|
|
||||||
if(__comp < 0) { \
|
|
||||||
SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
SPLAY_RIGHT(elm, field) = (head)->sph_root; \
|
|
||||||
SPLAY_LEFT((head)->sph_root, field) = NULL; \
|
|
||||||
} else if (__comp > 0) { \
|
|
||||||
SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
SPLAY_LEFT(elm, field) = (head)->sph_root; \
|
|
||||||
SPLAY_RIGHT((head)->sph_root, field) = NULL; \
|
|
||||||
} else \
|
|
||||||
return ((head)->sph_root); \
|
|
||||||
} \
|
|
||||||
(head)->sph_root = (elm); \
|
|
||||||
return (NULL); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
struct type * \
|
|
||||||
name##_SPLAY_REMOVE(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *__tmp; \
|
|
||||||
if (SPLAY_EMPTY(head)) \
|
|
||||||
return (NULL); \
|
|
||||||
name##_SPLAY(head, elm); \
|
|
||||||
if ((cmp)(elm, (head)->sph_root) == 0) { \
|
|
||||||
if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \
|
|
||||||
(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
} else { \
|
|
||||||
__tmp = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
(head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
name##_SPLAY(head, elm); \
|
|
||||||
SPLAY_RIGHT((head)->sph_root, field) = __tmp; \
|
|
||||||
} \
|
|
||||||
return (elm); \
|
|
||||||
} \
|
|
||||||
return (NULL); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
void \
|
|
||||||
name##_SPLAY(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type __node, *__left, *__right, *__tmp; \
|
|
||||||
int __comp; \
|
|
||||||
\
|
|
||||||
SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \
|
|
||||||
__left = __right = &__node; \
|
|
||||||
\
|
|
||||||
while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \
|
|
||||||
if (__comp < 0) { \
|
|
||||||
__tmp = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
if (__tmp == NULL) \
|
|
||||||
break; \
|
|
||||||
if ((cmp)(elm, __tmp) < 0){ \
|
|
||||||
SPLAY_ROTATE_RIGHT(head, __tmp, field); \
|
|
||||||
if (SPLAY_LEFT((head)->sph_root, field) == NULL) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
SPLAY_LINKLEFT(head, __right, field); \
|
|
||||||
} else if (__comp > 0) { \
|
|
||||||
__tmp = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
if (__tmp == NULL) \
|
|
||||||
break; \
|
|
||||||
if ((cmp)(elm, __tmp) > 0){ \
|
|
||||||
SPLAY_ROTATE_LEFT(head, __tmp, field); \
|
|
||||||
if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
SPLAY_LINKRIGHT(head, __left, field); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* Splay with either the minimum or the maximum element \
|
|
||||||
* Used to find minimum or maximum element in tree. \
|
|
||||||
*/ \
|
|
||||||
void name##_SPLAY_MINMAX(struct name *head, int __comp) \
|
|
||||||
{ \
|
|
||||||
struct type __node, *__left, *__right, *__tmp; \
|
|
||||||
\
|
|
||||||
SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \
|
|
||||||
__left = __right = &__node; \
|
|
||||||
\
|
|
||||||
while (1) { \
|
|
||||||
if (__comp < 0) { \
|
|
||||||
__tmp = SPLAY_LEFT((head)->sph_root, field); \
|
|
||||||
if (__tmp == NULL) \
|
|
||||||
break; \
|
|
||||||
if (__comp < 0){ \
|
|
||||||
SPLAY_ROTATE_RIGHT(head, __tmp, field); \
|
|
||||||
if (SPLAY_LEFT((head)->sph_root, field) == NULL) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
SPLAY_LINKLEFT(head, __right, field); \
|
|
||||||
} else if (__comp > 0) { \
|
|
||||||
__tmp = SPLAY_RIGHT((head)->sph_root, field); \
|
|
||||||
if (__tmp == NULL) \
|
|
||||||
break; \
|
|
||||||
if (__comp > 0) { \
|
|
||||||
SPLAY_ROTATE_LEFT(head, __tmp, field); \
|
|
||||||
if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
SPLAY_LINKRIGHT(head, __left, field); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SPLAY_NEGINF -1
|
|
||||||
#define SPLAY_INF 1
|
|
||||||
|
|
||||||
#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y)
|
|
||||||
#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y)
|
|
||||||
#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y)
|
|
||||||
#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y)
|
|
||||||
#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \
|
|
||||||
: name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF))
|
|
||||||
#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \
|
|
||||||
: name##_SPLAY_MIN_MAX(x, SPLAY_INF))
|
|
||||||
|
|
||||||
#define SPLAY_FOREACH(x, name, head) \
|
|
||||||
for ((x) = SPLAY_MIN(name, head); \
|
|
||||||
(x) != NULL; \
|
|
||||||
(x) = SPLAY_NEXT(name, head, x))
|
|
||||||
|
|
||||||
/* Macros that define a red-black tree */
|
|
||||||
#define RB_HEAD(name, type) \
|
|
||||||
struct name { \
|
|
||||||
struct type *rbh_root; /* root of the tree */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RB_INITIALIZER(root) \
|
|
||||||
{ NULL }
|
|
||||||
|
|
||||||
#define RB_INIT(root) do { \
|
|
||||||
(root)->rbh_root = NULL; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define RB_BLACK 0
|
|
||||||
#define RB_RED 1
|
|
||||||
#define RB_ENTRY(type) \
|
|
||||||
struct { \
|
|
||||||
struct type *rbe_left; /* left element */ \
|
|
||||||
struct type *rbe_right; /* right element */ \
|
|
||||||
struct type *rbe_parent; /* parent element */ \
|
|
||||||
int rbe_color; /* node color */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RB_LEFT(elm, field) (elm)->field.rbe_left
|
|
||||||
#define RB_RIGHT(elm, field) (elm)->field.rbe_right
|
|
||||||
#define RB_PARENT(elm, field) (elm)->field.rbe_parent
|
|
||||||
#define RB_COLOR(elm, field) (elm)->field.rbe_color
|
|
||||||
#define RB_ROOT(head) (head)->rbh_root
|
|
||||||
#define RB_EMPTY(head) (RB_ROOT(head) == NULL)
|
|
||||||
|
|
||||||
#define RB_SET(elm, parent, field) do { \
|
|
||||||
RB_PARENT(elm, field) = parent; \
|
|
||||||
RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \
|
|
||||||
RB_COLOR(elm, field) = RB_RED; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define RB_SET_BLACKRED(black, red, field) do { \
|
|
||||||
RB_COLOR(black, field) = RB_BLACK; \
|
|
||||||
RB_COLOR(red, field) = RB_RED; \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#ifndef RB_AUGMENT
|
|
||||||
#define RB_AUGMENT(x) do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
|
|
||||||
(tmp) = RB_RIGHT(elm, field); \
|
|
||||||
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \
|
|
||||||
RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
|
|
||||||
} \
|
|
||||||
RB_AUGMENT(elm); \
|
|
||||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
|
||||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
|
||||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
|
|
||||||
} else \
|
|
||||||
(head)->rbh_root = (tmp); \
|
|
||||||
RB_LEFT(tmp, field) = (elm); \
|
|
||||||
RB_PARENT(elm, field) = (tmp); \
|
|
||||||
RB_AUGMENT(tmp); \
|
|
||||||
if ((RB_PARENT(tmp, field))) \
|
|
||||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
|
|
||||||
(tmp) = RB_LEFT(elm, field); \
|
|
||||||
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \
|
|
||||||
RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
|
|
||||||
} \
|
|
||||||
RB_AUGMENT(elm); \
|
|
||||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
|
||||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
|
||||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
|
|
||||||
} else \
|
|
||||||
(head)->rbh_root = (tmp); \
|
|
||||||
RB_RIGHT(tmp, field) = (elm); \
|
|
||||||
RB_PARENT(elm, field) = (tmp); \
|
|
||||||
RB_AUGMENT(tmp); \
|
|
||||||
if ((RB_PARENT(tmp, field))) \
|
|
||||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
|
||||||
} while (/*CONSTCOND*/ 0)
|
|
||||||
|
|
||||||
/* Generates prototypes and inline functions */
|
|
||||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
|
||||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
|
|
||||||
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
|
|
||||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
|
|
||||||
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
|
|
||||||
attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \
|
|
||||||
attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
|
|
||||||
attr struct type *name##_RB_REMOVE(struct name *, struct type *); \
|
|
||||||
attr struct type *name##_RB_INSERT(struct name *, struct type *); \
|
|
||||||
attr struct type *name##_RB_FIND(struct name *, struct type *); \
|
|
||||||
attr struct type *name##_RB_NFIND(struct name *, struct type *); \
|
|
||||||
attr struct type *name##_RB_NEXT(struct type *); \
|
|
||||||
attr struct type *name##_RB_PREV(struct type *); \
|
|
||||||
attr struct type *name##_RB_MINMAX(struct name *, int); \
|
|
||||||
\
|
|
||||||
|
|
||||||
/* Main rb operation.
|
|
||||||
* Moves node close to the key of elm to top
|
|
||||||
*/
|
|
||||||
#define RB_GENERATE(name, type, field, cmp) \
|
|
||||||
RB_GENERATE_INTERNAL(name, type, field, cmp,)
|
|
||||||
#define RB_GENERATE_STATIC(name, type, field, cmp) \
|
|
||||||
RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static)
|
|
||||||
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
|
|
||||||
attr void \
|
|
||||||
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *parent, *gparent, *tmp; \
|
|
||||||
while ((parent = RB_PARENT(elm, field)) != NULL && \
|
|
||||||
RB_COLOR(parent, field) == RB_RED) { \
|
|
||||||
gparent = RB_PARENT(parent, field); \
|
|
||||||
if (parent == RB_LEFT(gparent, field)) { \
|
|
||||||
tmp = RB_RIGHT(gparent, field); \
|
|
||||||
if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
|
|
||||||
RB_COLOR(tmp, field) = RB_BLACK; \
|
|
||||||
RB_SET_BLACKRED(parent, gparent, field); \
|
|
||||||
elm = gparent; \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
if (RB_RIGHT(parent, field) == elm) { \
|
|
||||||
RB_ROTATE_LEFT(head, parent, tmp, field); \
|
|
||||||
tmp = parent; \
|
|
||||||
parent = elm; \
|
|
||||||
elm = tmp; \
|
|
||||||
} \
|
|
||||||
RB_SET_BLACKRED(parent, gparent, field); \
|
|
||||||
RB_ROTATE_RIGHT(head, gparent, tmp, field); \
|
|
||||||
} else { \
|
|
||||||
tmp = RB_LEFT(gparent, field); \
|
|
||||||
if (tmp && RB_COLOR(tmp, field) == RB_RED) { \
|
|
||||||
RB_COLOR(tmp, field) = RB_BLACK; \
|
|
||||||
RB_SET_BLACKRED(parent, gparent, field); \
|
|
||||||
elm = gparent; \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
if (RB_LEFT(parent, field) == elm) { \
|
|
||||||
RB_ROTATE_RIGHT(head, parent, tmp, field); \
|
|
||||||
tmp = parent; \
|
|
||||||
parent = elm; \
|
|
||||||
elm = tmp; \
|
|
||||||
} \
|
|
||||||
RB_SET_BLACKRED(parent, gparent, field); \
|
|
||||||
RB_ROTATE_LEFT(head, gparent, tmp, field); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
attr void \
|
|
||||||
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \
|
|
||||||
struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *tmp; \
|
|
||||||
while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \
|
|
||||||
elm != RB_ROOT(head)) { \
|
|
||||||
if (RB_LEFT(parent, field) == elm) { \
|
|
||||||
tmp = RB_RIGHT(parent, field); \
|
|
||||||
if (RB_COLOR(tmp, field) == RB_RED) { \
|
|
||||||
RB_SET_BLACKRED(tmp, parent, field); \
|
|
||||||
RB_ROTATE_LEFT(head, parent, tmp, field); \
|
|
||||||
tmp = RB_RIGHT(parent, field); \
|
|
||||||
} \
|
|
||||||
if ((RB_LEFT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
|
|
||||||
(RB_RIGHT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
|
|
||||||
RB_COLOR(tmp, field) = RB_RED; \
|
|
||||||
elm = parent; \
|
|
||||||
parent = RB_PARENT(elm, field); \
|
|
||||||
} else { \
|
|
||||||
if (RB_RIGHT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \
|
|
||||||
struct type *oleft; \
|
|
||||||
if ((oleft = RB_LEFT(tmp, field)) \
|
|
||||||
!= NULL) \
|
|
||||||
RB_COLOR(oleft, field) = RB_BLACK; \
|
|
||||||
RB_COLOR(tmp, field) = RB_RED; \
|
|
||||||
RB_ROTATE_RIGHT(head, tmp, oleft, field); \
|
|
||||||
tmp = RB_RIGHT(parent, field); \
|
|
||||||
} \
|
|
||||||
RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
|
|
||||||
RB_COLOR(parent, field) = RB_BLACK; \
|
|
||||||
if (RB_RIGHT(tmp, field)) \
|
|
||||||
RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \
|
|
||||||
RB_ROTATE_LEFT(head, parent, tmp, field); \
|
|
||||||
elm = RB_ROOT(head); \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
tmp = RB_LEFT(parent, field); \
|
|
||||||
if (RB_COLOR(tmp, field) == RB_RED) { \
|
|
||||||
RB_SET_BLACKRED(tmp, parent, field); \
|
|
||||||
RB_ROTATE_RIGHT(head, parent, tmp, field); \
|
|
||||||
tmp = RB_LEFT(parent, field); \
|
|
||||||
} \
|
|
||||||
if ((RB_LEFT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \
|
|
||||||
(RB_RIGHT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \
|
|
||||||
RB_COLOR(tmp, field) = RB_RED; \
|
|
||||||
elm = parent; \
|
|
||||||
parent = RB_PARENT(elm, field); \
|
|
||||||
} else { \
|
|
||||||
if (RB_LEFT(tmp, field) == NULL || \
|
|
||||||
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \
|
|
||||||
struct type *oright; \
|
|
||||||
if ((oright = RB_RIGHT(tmp, field)) \
|
|
||||||
!= NULL) \
|
|
||||||
RB_COLOR(oright, field) = RB_BLACK; \
|
|
||||||
RB_COLOR(tmp, field) = RB_RED; \
|
|
||||||
RB_ROTATE_LEFT(head, tmp, oright, field); \
|
|
||||||
tmp = RB_LEFT(parent, field); \
|
|
||||||
} \
|
|
||||||
RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
|
|
||||||
RB_COLOR(parent, field) = RB_BLACK; \
|
|
||||||
if (RB_LEFT(tmp, field)) \
|
|
||||||
RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \
|
|
||||||
RB_ROTATE_RIGHT(head, parent, tmp, field); \
|
|
||||||
elm = RB_ROOT(head); \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
if (elm) \
|
|
||||||
RB_COLOR(elm, field) = RB_BLACK; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_REMOVE(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *child, *parent, *old = elm; \
|
|
||||||
int color; \
|
|
||||||
if (RB_LEFT(elm, field) == NULL) \
|
|
||||||
child = RB_RIGHT(elm, field); \
|
|
||||||
else if (RB_RIGHT(elm, field) == NULL) \
|
|
||||||
child = RB_LEFT(elm, field); \
|
|
||||||
else { \
|
|
||||||
struct type *left; \
|
|
||||||
elm = RB_RIGHT(elm, field); \
|
|
||||||
while ((left = RB_LEFT(elm, field)) != NULL) \
|
|
||||||
elm = left; \
|
|
||||||
child = RB_RIGHT(elm, field); \
|
|
||||||
parent = RB_PARENT(elm, field); \
|
|
||||||
color = RB_COLOR(elm, field); \
|
|
||||||
if (child) \
|
|
||||||
RB_PARENT(child, field) = parent; \
|
|
||||||
if (parent) { \
|
|
||||||
if (RB_LEFT(parent, field) == elm) \
|
|
||||||
RB_LEFT(parent, field) = child; \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(parent, field) = child; \
|
|
||||||
RB_AUGMENT(parent); \
|
|
||||||
} else \
|
|
||||||
RB_ROOT(head) = child; \
|
|
||||||
if (RB_PARENT(elm, field) == old) \
|
|
||||||
parent = elm; \
|
|
||||||
(elm)->field = (old)->field; \
|
|
||||||
if (RB_PARENT(old, field)) { \
|
|
||||||
if (RB_LEFT(RB_PARENT(old, field), field) == old) \
|
|
||||||
RB_LEFT(RB_PARENT(old, field), field) = elm; \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(RB_PARENT(old, field), field) = elm; \
|
|
||||||
RB_AUGMENT(RB_PARENT(old, field)); \
|
|
||||||
} else \
|
|
||||||
RB_ROOT(head) = elm; \
|
|
||||||
RB_PARENT(RB_LEFT(old, field), field) = elm; \
|
|
||||||
if (RB_RIGHT(old, field)) \
|
|
||||||
RB_PARENT(RB_RIGHT(old, field), field) = elm; \
|
|
||||||
if (parent) { \
|
|
||||||
left = parent; \
|
|
||||||
do { \
|
|
||||||
RB_AUGMENT(left); \
|
|
||||||
} while ((left = RB_PARENT(left, field)) != NULL); \
|
|
||||||
} \
|
|
||||||
goto color; \
|
|
||||||
} \
|
|
||||||
parent = RB_PARENT(elm, field); \
|
|
||||||
color = RB_COLOR(elm, field); \
|
|
||||||
if (child) \
|
|
||||||
RB_PARENT(child, field) = parent; \
|
|
||||||
if (parent) { \
|
|
||||||
if (RB_LEFT(parent, field) == elm) \
|
|
||||||
RB_LEFT(parent, field) = child; \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(parent, field) = child; \
|
|
||||||
RB_AUGMENT(parent); \
|
|
||||||
} else \
|
|
||||||
RB_ROOT(head) = child; \
|
|
||||||
color: \
|
|
||||||
if (color == RB_BLACK) \
|
|
||||||
name##_RB_REMOVE_COLOR(head, parent, child); \
|
|
||||||
return (old); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* Inserts a node into the RB tree */ \
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_INSERT(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *tmp; \
|
|
||||||
struct type *parent = NULL; \
|
|
||||||
int comp = 0; \
|
|
||||||
tmp = RB_ROOT(head); \
|
|
||||||
while (tmp) { \
|
|
||||||
parent = tmp; \
|
|
||||||
comp = (cmp)(elm, parent); \
|
|
||||||
if (comp < 0) \
|
|
||||||
tmp = RB_LEFT(tmp, field); \
|
|
||||||
else if (comp > 0) \
|
|
||||||
tmp = RB_RIGHT(tmp, field); \
|
|
||||||
else \
|
|
||||||
return (tmp); \
|
|
||||||
} \
|
|
||||||
RB_SET(elm, parent, field); \
|
|
||||||
if (parent != NULL) { \
|
|
||||||
if (comp < 0) \
|
|
||||||
RB_LEFT(parent, field) = elm; \
|
|
||||||
else \
|
|
||||||
RB_RIGHT(parent, field) = elm; \
|
|
||||||
RB_AUGMENT(parent); \
|
|
||||||
} else \
|
|
||||||
RB_ROOT(head) = elm; \
|
|
||||||
name##_RB_INSERT_COLOR(head, elm); \
|
|
||||||
return (NULL); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* Finds the node with the same key as elm */ \
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_FIND(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *tmp = RB_ROOT(head); \
|
|
||||||
int comp; \
|
|
||||||
while (tmp) { \
|
|
||||||
comp = cmp(elm, tmp); \
|
|
||||||
if (comp < 0) \
|
|
||||||
tmp = RB_LEFT(tmp, field); \
|
|
||||||
else if (comp > 0) \
|
|
||||||
tmp = RB_RIGHT(tmp, field); \
|
|
||||||
else \
|
|
||||||
return (tmp); \
|
|
||||||
} \
|
|
||||||
return (NULL); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* Finds the first node greater than or equal to the search key */ \
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_NFIND(struct name *head, struct type *elm) \
|
|
||||||
{ \
|
|
||||||
struct type *tmp = RB_ROOT(head); \
|
|
||||||
struct type *res = NULL; \
|
|
||||||
int comp; \
|
|
||||||
while (tmp) { \
|
|
||||||
comp = cmp(elm, tmp); \
|
|
||||||
if (comp < 0) { \
|
|
||||||
res = tmp; \
|
|
||||||
tmp = RB_LEFT(tmp, field); \
|
|
||||||
} \
|
|
||||||
else if (comp > 0) \
|
|
||||||
tmp = RB_RIGHT(tmp, field); \
|
|
||||||
else \
|
|
||||||
return (tmp); \
|
|
||||||
} \
|
|
||||||
return (res); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* ARGSUSED */ \
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_NEXT(struct type *elm) \
|
|
||||||
{ \
|
|
||||||
if (RB_RIGHT(elm, field)) { \
|
|
||||||
elm = RB_RIGHT(elm, field); \
|
|
||||||
while (RB_LEFT(elm, field)) \
|
|
||||||
elm = RB_LEFT(elm, field); \
|
|
||||||
} else { \
|
|
||||||
if (RB_PARENT(elm, field) && \
|
|
||||||
(elm == RB_LEFT(RB_PARENT(elm, field), field))) \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
else { \
|
|
||||||
while (RB_PARENT(elm, field) && \
|
|
||||||
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
return (elm); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
/* ARGSUSED */ \
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_PREV(struct type *elm) \
|
|
||||||
{ \
|
|
||||||
if (RB_LEFT(elm, field)) { \
|
|
||||||
elm = RB_LEFT(elm, field); \
|
|
||||||
while (RB_RIGHT(elm, field)) \
|
|
||||||
elm = RB_RIGHT(elm, field); \
|
|
||||||
} else { \
|
|
||||||
if (RB_PARENT(elm, field) && \
|
|
||||||
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
else { \
|
|
||||||
while (RB_PARENT(elm, field) && \
|
|
||||||
(elm == RB_LEFT(RB_PARENT(elm, field), field))) \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
elm = RB_PARENT(elm, field); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
return (elm); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
attr struct type * \
|
|
||||||
name##_RB_MINMAX(struct name *head, int val) \
|
|
||||||
{ \
|
|
||||||
struct type *tmp = RB_ROOT(head); \
|
|
||||||
struct type *parent = NULL; \
|
|
||||||
while (tmp) { \
|
|
||||||
parent = tmp; \
|
|
||||||
if (val < 0) \
|
|
||||||
tmp = RB_LEFT(tmp, field); \
|
|
||||||
else \
|
|
||||||
tmp = RB_RIGHT(tmp, field); \
|
|
||||||
} \
|
|
||||||
return (parent); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RB_NEGINF -1
|
|
||||||
#define RB_INF 1
|
|
||||||
|
|
||||||
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
|
|
||||||
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
|
|
||||||
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
|
|
||||||
#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
|
|
||||||
#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
|
|
||||||
#define RB_PREV(name, x, y) name##_RB_PREV(y)
|
|
||||||
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
|
|
||||||
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
|
|
||||||
|
|
||||||
#define RB_FOREACH(x, name, head) \
|
|
||||||
for ((x) = RB_MIN(name, head); \
|
|
||||||
(x) != NULL; \
|
|
||||||
(x) = name##_RB_NEXT(x))
|
|
||||||
|
|
||||||
#define RB_FOREACH_FROM(x, name, y) \
|
|
||||||
for ((x) = (y); \
|
|
||||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
|
||||||
(x) = (y))
|
|
||||||
|
|
||||||
#define RB_FOREACH_SAFE(x, name, head, y) \
|
|
||||||
for ((x) = RB_MIN(name, head); \
|
|
||||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
|
||||||
(x) = (y))
|
|
||||||
|
|
||||||
#define RB_FOREACH_REVERSE(x, name, head) \
|
|
||||||
for ((x) = RB_MAX(name, head); \
|
|
||||||
(x) != NULL; \
|
|
||||||
(x) = name##_RB_PREV(x))
|
|
||||||
|
|
||||||
#define RB_FOREACH_REVERSE_FROM(x, name, y) \
|
|
||||||
for ((x) = (y); \
|
|
||||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
|
||||||
(x) = (y))
|
|
||||||
|
|
||||||
#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \
|
|
||||||
for ((x) = RB_MAX(name, head); \
|
|
||||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
|
||||||
(x) = (y))
|
|
||||||
|
|
||||||
#endif /* UV_TREE_H_ */
|
|
||||||
@@ -1,507 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_UNIX_H
|
|
||||||
#define UV_UNIX_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/tcp.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h> /* MAXHOSTNAMELEN on Solaris */
|
|
||||||
|
|
||||||
#include <termios.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
|
|
||||||
#if !defined(__MVS__)
|
|
||||||
#include <semaphore.h>
|
|
||||||
#include <sys/param.h> /* MAXHOSTNAMELEN on Linux and the BSDs */
|
|
||||||
#endif
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include "uv/threadpool.h"
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
|
||||||
# include "uv/linux.h"
|
|
||||||
#elif defined (__MVS__)
|
|
||||||
# include "uv/os390.h"
|
|
||||||
#elif defined(__PASE__) /* __PASE__ and _AIX are both defined on IBM i */
|
|
||||||
# include "uv/posix.h" /* IBM i needs uv/posix.h, not uv/aix.h */
|
|
||||||
#elif defined(_AIX)
|
|
||||||
# include "uv/aix.h"
|
|
||||||
#elif defined(__sun)
|
|
||||||
# include "uv/sunos.h"
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
# include "uv/darwin.h"
|
|
||||||
#elif defined(__DragonFly__) || \
|
|
||||||
defined(__FreeBSD__) || \
|
|
||||||
defined(__FreeBSD_kernel__) || \
|
|
||||||
defined(__OpenBSD__) || \
|
|
||||||
defined(__NetBSD__)
|
|
||||||
# include "uv/bsd.h"
|
|
||||||
#elif defined(__CYGWIN__) || \
|
|
||||||
defined(__MSYS__) || \
|
|
||||||
defined(__GNU__)
|
|
||||||
# include "uv/posix.h"
|
|
||||||
#elif defined(__HAIKU__)
|
|
||||||
# include "uv/posix.h"
|
|
||||||
#elif defined(__QNX__)
|
|
||||||
# include "uv/posix.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NI_MAXHOST
|
|
||||||
# define NI_MAXHOST 1025
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NI_MAXSERV
|
|
||||||
# define NI_MAXSERV 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UV_IO_PRIVATE_PLATFORM_FIELDS
|
|
||||||
# define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct uv__io_s;
|
|
||||||
struct uv_loop_s;
|
|
||||||
|
|
||||||
typedef void (*uv__io_cb)(struct uv_loop_s* loop,
|
|
||||||
struct uv__io_s* w,
|
|
||||||
unsigned int events);
|
|
||||||
typedef struct uv__io_s uv__io_t;
|
|
||||||
|
|
||||||
struct uv__io_s {
|
|
||||||
uv__io_cb cb;
|
|
||||||
void* pending_queue[2];
|
|
||||||
void* watcher_queue[2];
|
|
||||||
unsigned int pevents; /* Pending event mask i.e. mask at next tick. */
|
|
||||||
unsigned int events; /* Current event mask. */
|
|
||||||
int fd;
|
|
||||||
UV_IO_PRIVATE_PLATFORM_FIELDS
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef UV_PLATFORM_SEM_T
|
|
||||||
# define UV_PLATFORM_SEM_T sem_t
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UV_PLATFORM_LOOP_FIELDS
|
|
||||||
# define UV_PLATFORM_LOOP_FIELDS /* empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UV_PLATFORM_FS_EVENT_FIELDS
|
|
||||||
# define UV_PLATFORM_FS_EVENT_FIELDS /* empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS
|
|
||||||
# define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Note: May be cast to struct iovec. See writev(2). */
|
|
||||||
typedef struct uv_buf_t {
|
|
||||||
char* base;
|
|
||||||
size_t len;
|
|
||||||
} uv_buf_t;
|
|
||||||
|
|
||||||
typedef int uv_file;
|
|
||||||
typedef int uv_os_sock_t;
|
|
||||||
typedef int uv_os_fd_t;
|
|
||||||
typedef pid_t uv_pid_t;
|
|
||||||
|
|
||||||
#define UV_ONCE_INIT PTHREAD_ONCE_INIT
|
|
||||||
|
|
||||||
typedef pthread_once_t uv_once_t;
|
|
||||||
typedef pthread_t uv_thread_t;
|
|
||||||
typedef pthread_mutex_t uv_mutex_t;
|
|
||||||
typedef pthread_rwlock_t uv_rwlock_t;
|
|
||||||
typedef UV_PLATFORM_SEM_T uv_sem_t;
|
|
||||||
typedef pthread_cond_t uv_cond_t;
|
|
||||||
typedef pthread_key_t uv_key_t;
|
|
||||||
|
|
||||||
/* Note: guard clauses should match uv_barrier_init's in src/unix/thread.c. */
|
|
||||||
#if defined(_AIX) || \
|
|
||||||
defined(__OpenBSD__) || \
|
|
||||||
!defined(PTHREAD_BARRIER_SERIAL_THREAD)
|
|
||||||
/* TODO(bnoordhuis) Merge into uv_barrier_t in v2. */
|
|
||||||
struct _uv_barrier {
|
|
||||||
uv_mutex_t mutex;
|
|
||||||
uv_cond_t cond;
|
|
||||||
unsigned threshold;
|
|
||||||
unsigned in;
|
|
||||||
unsigned out;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct _uv_barrier* b;
|
|
||||||
# if defined(PTHREAD_BARRIER_SERIAL_THREAD)
|
|
||||||
/* TODO(bnoordhuis) Remove padding in v2. */
|
|
||||||
char pad[sizeof(pthread_barrier_t) - sizeof(struct _uv_barrier*)];
|
|
||||||
# endif
|
|
||||||
} uv_barrier_t;
|
|
||||||
#else
|
|
||||||
typedef pthread_barrier_t uv_barrier_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Platform-specific definitions for uv_spawn support. */
|
|
||||||
typedef gid_t uv_gid_t;
|
|
||||||
typedef uid_t uv_uid_t;
|
|
||||||
|
|
||||||
typedef struct dirent uv__dirent_t;
|
|
||||||
|
|
||||||
#define UV_DIR_PRIVATE_FIELDS \
|
|
||||||
DIR* dir;
|
|
||||||
|
|
||||||
#if defined(DT_UNKNOWN)
|
|
||||||
# define HAVE_DIRENT_TYPES
|
|
||||||
# if defined(DT_REG)
|
|
||||||
# define UV__DT_FILE DT_REG
|
|
||||||
# else
|
|
||||||
# define UV__DT_FILE -1
|
|
||||||
# endif
|
|
||||||
# if defined(DT_DIR)
|
|
||||||
# define UV__DT_DIR DT_DIR
|
|
||||||
# else
|
|
||||||
# define UV__DT_DIR -2
|
|
||||||
# endif
|
|
||||||
# if defined(DT_LNK)
|
|
||||||
# define UV__DT_LINK DT_LNK
|
|
||||||
# else
|
|
||||||
# define UV__DT_LINK -3
|
|
||||||
# endif
|
|
||||||
# if defined(DT_FIFO)
|
|
||||||
# define UV__DT_FIFO DT_FIFO
|
|
||||||
# else
|
|
||||||
# define UV__DT_FIFO -4
|
|
||||||
# endif
|
|
||||||
# if defined(DT_SOCK)
|
|
||||||
# define UV__DT_SOCKET DT_SOCK
|
|
||||||
# else
|
|
||||||
# define UV__DT_SOCKET -5
|
|
||||||
# endif
|
|
||||||
# if defined(DT_CHR)
|
|
||||||
# define UV__DT_CHAR DT_CHR
|
|
||||||
# else
|
|
||||||
# define UV__DT_CHAR -6
|
|
||||||
# endif
|
|
||||||
# if defined(DT_BLK)
|
|
||||||
# define UV__DT_BLOCK DT_BLK
|
|
||||||
# else
|
|
||||||
# define UV__DT_BLOCK -7
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Platform-specific definitions for uv_dlopen support. */
|
|
||||||
#define UV_DYNAMIC /* empty */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
void* handle;
|
|
||||||
char* errmsg;
|
|
||||||
} uv_lib_t;
|
|
||||||
|
|
||||||
#define UV_LOOP_PRIVATE_FIELDS \
|
|
||||||
unsigned long flags; \
|
|
||||||
int backend_fd; \
|
|
||||||
void* pending_queue[2]; \
|
|
||||||
void* watcher_queue[2]; \
|
|
||||||
uv__io_t** watchers; \
|
|
||||||
unsigned int nwatchers; \
|
|
||||||
unsigned int nfds; \
|
|
||||||
void* wq[2]; \
|
|
||||||
uv_mutex_t wq_mutex; \
|
|
||||||
uv_async_t wq_async; \
|
|
||||||
uv_rwlock_t cloexec_lock; \
|
|
||||||
uv_handle_t* closing_handles; \
|
|
||||||
void* process_handles[2]; \
|
|
||||||
void* prepare_handles[2]; \
|
|
||||||
void* check_handles[2]; \
|
|
||||||
void* idle_handles[2]; \
|
|
||||||
void* async_handles[2]; \
|
|
||||||
void (*async_unused)(void); /* TODO(bnoordhuis) Remove in libuv v2. */ \
|
|
||||||
uv__io_t async_io_watcher; \
|
|
||||||
int async_wfd; \
|
|
||||||
struct { \
|
|
||||||
void* min; \
|
|
||||||
unsigned int nelts; \
|
|
||||||
} timer_heap; \
|
|
||||||
uint64_t timer_counter; \
|
|
||||||
uint64_t time; \
|
|
||||||
int signal_pipefd[2]; \
|
|
||||||
uv__io_t signal_io_watcher; \
|
|
||||||
uv_signal_t child_watcher; \
|
|
||||||
int emfile_fd; \
|
|
||||||
UV_PLATFORM_LOOP_FIELDS \
|
|
||||||
|
|
||||||
#define UV_REQ_TYPE_PRIVATE /* empty */
|
|
||||||
|
|
||||||
#define UV_REQ_PRIVATE_FIELDS /* empty */
|
|
||||||
|
|
||||||
#define UV_PRIVATE_REQ_TYPES /* empty */
|
|
||||||
|
|
||||||
#define UV_WRITE_PRIVATE_FIELDS \
|
|
||||||
void* queue[2]; \
|
|
||||||
unsigned int write_index; \
|
|
||||||
uv_buf_t* bufs; \
|
|
||||||
unsigned int nbufs; \
|
|
||||||
int error; \
|
|
||||||
uv_buf_t bufsml[4]; \
|
|
||||||
|
|
||||||
#define UV_CONNECT_PRIVATE_FIELDS \
|
|
||||||
void* queue[2]; \
|
|
||||||
|
|
||||||
#define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */
|
|
||||||
|
|
||||||
#define UV_UDP_SEND_PRIVATE_FIELDS \
|
|
||||||
void* queue[2]; \
|
|
||||||
struct sockaddr_storage addr; \
|
|
||||||
unsigned int nbufs; \
|
|
||||||
uv_buf_t* bufs; \
|
|
||||||
ssize_t status; \
|
|
||||||
uv_udp_send_cb send_cb; \
|
|
||||||
uv_buf_t bufsml[4]; \
|
|
||||||
|
|
||||||
#define UV_HANDLE_PRIVATE_FIELDS \
|
|
||||||
uv_handle_t* next_closing; \
|
|
||||||
unsigned int flags; \
|
|
||||||
|
|
||||||
#define UV_STREAM_PRIVATE_FIELDS \
|
|
||||||
uv_connect_t *connect_req; \
|
|
||||||
uv_shutdown_t *shutdown_req; \
|
|
||||||
uv__io_t io_watcher; \
|
|
||||||
void* write_queue[2]; \
|
|
||||||
void* write_completed_queue[2]; \
|
|
||||||
uv_connection_cb connection_cb; \
|
|
||||||
int delayed_error; \
|
|
||||||
int accepted_fd; \
|
|
||||||
void* queued_fds; \
|
|
||||||
UV_STREAM_PRIVATE_PLATFORM_FIELDS \
|
|
||||||
|
|
||||||
#define UV_TCP_PRIVATE_FIELDS /* empty */
|
|
||||||
|
|
||||||
#define UV_UDP_PRIVATE_FIELDS \
|
|
||||||
uv_alloc_cb alloc_cb; \
|
|
||||||
uv_udp_recv_cb recv_cb; \
|
|
||||||
uv__io_t io_watcher; \
|
|
||||||
void* write_queue[2]; \
|
|
||||||
void* write_completed_queue[2]; \
|
|
||||||
|
|
||||||
#define UV_PIPE_PRIVATE_FIELDS \
|
|
||||||
const char* pipe_fname; /* strdup'ed */
|
|
||||||
|
|
||||||
#define UV_POLL_PRIVATE_FIELDS \
|
|
||||||
uv__io_t io_watcher;
|
|
||||||
|
|
||||||
#define UV_PREPARE_PRIVATE_FIELDS \
|
|
||||||
uv_prepare_cb prepare_cb; \
|
|
||||||
void* queue[2]; \
|
|
||||||
|
|
||||||
#define UV_CHECK_PRIVATE_FIELDS \
|
|
||||||
uv_check_cb check_cb; \
|
|
||||||
void* queue[2]; \
|
|
||||||
|
|
||||||
#define UV_IDLE_PRIVATE_FIELDS \
|
|
||||||
uv_idle_cb idle_cb; \
|
|
||||||
void* queue[2]; \
|
|
||||||
|
|
||||||
#define UV_ASYNC_PRIVATE_FIELDS \
|
|
||||||
uv_async_cb async_cb; \
|
|
||||||
void* queue[2]; \
|
|
||||||
int pending; \
|
|
||||||
|
|
||||||
#define UV_TIMER_PRIVATE_FIELDS \
|
|
||||||
uv_timer_cb timer_cb; \
|
|
||||||
void* heap_node[3]; \
|
|
||||||
uint64_t timeout; \
|
|
||||||
uint64_t repeat; \
|
|
||||||
uint64_t start_id;
|
|
||||||
|
|
||||||
#define UV_GETADDRINFO_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
uv_getaddrinfo_cb cb; \
|
|
||||||
struct addrinfo* hints; \
|
|
||||||
char* hostname; \
|
|
||||||
char* service; \
|
|
||||||
struct addrinfo* addrinfo; \
|
|
||||||
int retcode;
|
|
||||||
|
|
||||||
#define UV_GETNAMEINFO_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
uv_getnameinfo_cb getnameinfo_cb; \
|
|
||||||
struct sockaddr_storage storage; \
|
|
||||||
int flags; \
|
|
||||||
char host[NI_MAXHOST]; \
|
|
||||||
char service[NI_MAXSERV]; \
|
|
||||||
int retcode;
|
|
||||||
|
|
||||||
#define UV_PROCESS_PRIVATE_FIELDS \
|
|
||||||
void* queue[2]; \
|
|
||||||
int status; \
|
|
||||||
|
|
||||||
#define UV_FS_PRIVATE_FIELDS \
|
|
||||||
const char *new_path; \
|
|
||||||
uv_file file; \
|
|
||||||
int flags; \
|
|
||||||
mode_t mode; \
|
|
||||||
unsigned int nbufs; \
|
|
||||||
uv_buf_t* bufs; \
|
|
||||||
off_t off; \
|
|
||||||
uv_uid_t uid; \
|
|
||||||
uv_gid_t gid; \
|
|
||||||
double atime; \
|
|
||||||
double mtime; \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
uv_buf_t bufsml[4]; \
|
|
||||||
|
|
||||||
#define UV_WORK_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req;
|
|
||||||
|
|
||||||
#define UV_TTY_PRIVATE_FIELDS \
|
|
||||||
struct termios orig_termios; \
|
|
||||||
int mode;
|
|
||||||
|
|
||||||
#define UV_SIGNAL_PRIVATE_FIELDS \
|
|
||||||
/* RB_ENTRY(uv_signal_s) tree_entry; */ \
|
|
||||||
struct { \
|
|
||||||
struct uv_signal_s* rbe_left; \
|
|
||||||
struct uv_signal_s* rbe_right; \
|
|
||||||
struct uv_signal_s* rbe_parent; \
|
|
||||||
int rbe_color; \
|
|
||||||
} tree_entry; \
|
|
||||||
/* Use two counters here so we don have to fiddle with atomics. */ \
|
|
||||||
unsigned int caught_signals; \
|
|
||||||
unsigned int dispatched_signals;
|
|
||||||
|
|
||||||
#define UV_FS_EVENT_PRIVATE_FIELDS \
|
|
||||||
uv_fs_event_cb cb; \
|
|
||||||
UV_PLATFORM_FS_EVENT_FIELDS \
|
|
||||||
|
|
||||||
/* fs open() flags supported on this platform: */
|
|
||||||
#if defined(O_APPEND)
|
|
||||||
# define UV_FS_O_APPEND O_APPEND
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_APPEND 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_CREAT)
|
|
||||||
# define UV_FS_O_CREAT O_CREAT
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_CREAT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__linux__) && defined(__arm__)
|
|
||||||
# define UV_FS_O_DIRECT 0x10000
|
|
||||||
#elif defined(__linux__) && defined(__m68k__)
|
|
||||||
# define UV_FS_O_DIRECT 0x10000
|
|
||||||
#elif defined(__linux__) && defined(__mips__)
|
|
||||||
# define UV_FS_O_DIRECT 0x08000
|
|
||||||
#elif defined(__linux__) && defined(__powerpc__)
|
|
||||||
# define UV_FS_O_DIRECT 0x20000
|
|
||||||
#elif defined(__linux__) && defined(__s390x__)
|
|
||||||
# define UV_FS_O_DIRECT 0x04000
|
|
||||||
#elif defined(__linux__) && defined(__x86_64__)
|
|
||||||
# define UV_FS_O_DIRECT 0x04000
|
|
||||||
#elif defined(O_DIRECT)
|
|
||||||
# define UV_FS_O_DIRECT O_DIRECT
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_DIRECT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(O_DIRECTORY)
|
|
||||||
# define UV_FS_O_DIRECTORY O_DIRECTORY
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_DIRECTORY 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_DSYNC)
|
|
||||||
# define UV_FS_O_DSYNC O_DSYNC
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_DSYNC 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_EXCL)
|
|
||||||
# define UV_FS_O_EXCL O_EXCL
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_EXCL 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_EXLOCK)
|
|
||||||
# define UV_FS_O_EXLOCK O_EXLOCK
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_EXLOCK 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_NOATIME)
|
|
||||||
# define UV_FS_O_NOATIME O_NOATIME
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_NOATIME 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_NOCTTY)
|
|
||||||
# define UV_FS_O_NOCTTY O_NOCTTY
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_NOCTTY 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_NOFOLLOW)
|
|
||||||
# define UV_FS_O_NOFOLLOW O_NOFOLLOW
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_NOFOLLOW 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_NONBLOCK)
|
|
||||||
# define UV_FS_O_NONBLOCK O_NONBLOCK
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_NONBLOCK 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_RDONLY)
|
|
||||||
# define UV_FS_O_RDONLY O_RDONLY
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_RDONLY 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_RDWR)
|
|
||||||
# define UV_FS_O_RDWR O_RDWR
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_RDWR 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_SYMLINK)
|
|
||||||
# define UV_FS_O_SYMLINK O_SYMLINK
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_SYMLINK 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_SYNC)
|
|
||||||
# define UV_FS_O_SYNC O_SYNC
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_SYNC 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_TRUNC)
|
|
||||||
# define UV_FS_O_TRUNC O_TRUNC
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_TRUNC 0
|
|
||||||
#endif
|
|
||||||
#if defined(O_WRONLY)
|
|
||||||
# define UV_FS_O_WRONLY O_WRONLY
|
|
||||||
#else
|
|
||||||
# define UV_FS_O_WRONLY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* fs open() flags supported on other platforms: */
|
|
||||||
#define UV_FS_O_FILEMAP 0
|
|
||||||
#define UV_FS_O_RANDOM 0
|
|
||||||
#define UV_FS_O_SHORT_LIVED 0
|
|
||||||
#define UV_FS_O_SEQUENTIAL 0
|
|
||||||
#define UV_FS_O_TEMPORARY 0
|
|
||||||
|
|
||||||
#endif /* UV_UNIX_H */
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UV_VERSION_H
|
|
||||||
#define UV_VERSION_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Versions with the same major number are ABI stable. API is allowed to
|
|
||||||
* evolve between minor releases, but only in a backwards compatible way.
|
|
||||||
* Make sure you update the -soname directives in configure.ac
|
|
||||||
* whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but
|
|
||||||
* not UV_VERSION_PATCH.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define UV_VERSION_MAJOR 1
|
|
||||||
#define UV_VERSION_MINOR 41
|
|
||||||
#define UV_VERSION_PATCH 0
|
|
||||||
#define UV_VERSION_IS_RELEASE 1
|
|
||||||
#define UV_VERSION_SUFFIX ""
|
|
||||||
|
|
||||||
#define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \
|
|
||||||
(UV_VERSION_MINOR << 8) | \
|
|
||||||
(UV_VERSION_PATCH))
|
|
||||||
|
|
||||||
#endif /* UV_VERSION_H */
|
|
||||||
@@ -1,691 +0,0 @@
|
|||||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _WIN32_WINNT
|
|
||||||
# define _WIN32_WINNT 0x0600
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
|
|
||||||
typedef intptr_t ssize_t;
|
|
||||||
# define SSIZE_MAX INTPTR_MAX
|
|
||||||
# define _SSIZE_T_
|
|
||||||
# define _SSIZE_T_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <winsock2.h>
|
|
||||||
|
|
||||||
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
|
|
||||||
typedef struct pollfd {
|
|
||||||
SOCKET fd;
|
|
||||||
short events;
|
|
||||||
short revents;
|
|
||||||
} WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef LOCALE_INVARIANT
|
|
||||||
# define LOCALE_INVARIANT 0x007f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <mswsock.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <process.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1600
|
|
||||||
# include "uv/stdint-msvc2008.h"
|
|
||||||
#else
|
|
||||||
# include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "uv/tree.h"
|
|
||||||
#include "uv/threadpool.h"
|
|
||||||
|
|
||||||
#define MAX_PIPENAME_LEN 256
|
|
||||||
|
|
||||||
#ifndef S_IFLNK
|
|
||||||
# define S_IFLNK 0xA000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Additional signals supported by uv_signal and or uv_kill. The CRT defines
|
|
||||||
* the following signals already:
|
|
||||||
*
|
|
||||||
* #define SIGINT 2
|
|
||||||
* #define SIGILL 4
|
|
||||||
* #define SIGABRT_COMPAT 6
|
|
||||||
* #define SIGFPE 8
|
|
||||||
* #define SIGSEGV 11
|
|
||||||
* #define SIGTERM 15
|
|
||||||
* #define SIGBREAK 21
|
|
||||||
* #define SIGABRT 22
|
|
||||||
*
|
|
||||||
* The additional signals have values that are common on other Unix
|
|
||||||
* variants (Linux and Darwin)
|
|
||||||
*/
|
|
||||||
#define SIGHUP 1
|
|
||||||
#define SIGKILL 9
|
|
||||||
#define SIGWINCH 28
|
|
||||||
|
|
||||||
/* Redefine NSIG to take SIGWINCH into consideration */
|
|
||||||
#if defined(NSIG) && NSIG <= SIGWINCH
|
|
||||||
# undef NSIG
|
|
||||||
#endif
|
|
||||||
#ifndef NSIG
|
|
||||||
# define NSIG SIGWINCH + 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many unix-like
|
|
||||||
* platforms. However MinGW doesn't define it, so we do. */
|
|
||||||
#ifndef SIGABRT_COMPAT
|
|
||||||
# define SIGABRT_COMPAT 6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Guids and typedefs for winsock extension functions
|
|
||||||
* Mingw32 doesn't have these :-(
|
|
||||||
*/
|
|
||||||
#ifndef WSAID_ACCEPTEX
|
|
||||||
# define WSAID_ACCEPTEX \
|
|
||||||
{0xb5367df1, 0xcbac, 0x11cf, \
|
|
||||||
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
|
|
||||||
|
|
||||||
# define WSAID_CONNECTEX \
|
|
||||||
{0x25a207b9, 0xddf3, 0x4660, \
|
|
||||||
{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
|
|
||||||
|
|
||||||
# define WSAID_GETACCEPTEXSOCKADDRS \
|
|
||||||
{0xb5367df2, 0xcbac, 0x11cf, \
|
|
||||||
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
|
|
||||||
|
|
||||||
# define WSAID_DISCONNECTEX \
|
|
||||||
{0x7fda2e11, 0x8630, 0x436f, \
|
|
||||||
{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
|
|
||||||
|
|
||||||
# define WSAID_TRANSMITFILE \
|
|
||||||
{0xb5367df0, 0xcbac, 0x11cf, \
|
|
||||||
{0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
|
|
||||||
|
|
||||||
typedef BOOL (PASCAL *LPFN_ACCEPTEX)
|
|
||||||
(SOCKET sListenSocket,
|
|
||||||
SOCKET sAcceptSocket,
|
|
||||||
PVOID lpOutputBuffer,
|
|
||||||
DWORD dwReceiveDataLength,
|
|
||||||
DWORD dwLocalAddressLength,
|
|
||||||
DWORD dwRemoteAddressLength,
|
|
||||||
LPDWORD lpdwBytesReceived,
|
|
||||||
LPOVERLAPPED lpOverlapped);
|
|
||||||
|
|
||||||
typedef BOOL (PASCAL *LPFN_CONNECTEX)
|
|
||||||
(SOCKET s,
|
|
||||||
const struct sockaddr* name,
|
|
||||||
int namelen,
|
|
||||||
PVOID lpSendBuffer,
|
|
||||||
DWORD dwSendDataLength,
|
|
||||||
LPDWORD lpdwBytesSent,
|
|
||||||
LPOVERLAPPED lpOverlapped);
|
|
||||||
|
|
||||||
typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS)
|
|
||||||
(PVOID lpOutputBuffer,
|
|
||||||
DWORD dwReceiveDataLength,
|
|
||||||
DWORD dwLocalAddressLength,
|
|
||||||
DWORD dwRemoteAddressLength,
|
|
||||||
LPSOCKADDR* LocalSockaddr,
|
|
||||||
LPINT LocalSockaddrLength,
|
|
||||||
LPSOCKADDR* RemoteSockaddr,
|
|
||||||
LPINT RemoteSockaddrLength);
|
|
||||||
|
|
||||||
typedef BOOL (PASCAL *LPFN_DISCONNECTEX)
|
|
||||||
(SOCKET hSocket,
|
|
||||||
LPOVERLAPPED lpOverlapped,
|
|
||||||
DWORD dwFlags,
|
|
||||||
DWORD reserved);
|
|
||||||
|
|
||||||
typedef BOOL (PASCAL *LPFN_TRANSMITFILE)
|
|
||||||
(SOCKET hSocket,
|
|
||||||
HANDLE hFile,
|
|
||||||
DWORD nNumberOfBytesToWrite,
|
|
||||||
DWORD nNumberOfBytesPerSend,
|
|
||||||
LPOVERLAPPED lpOverlapped,
|
|
||||||
LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
|
|
||||||
DWORD dwFlags);
|
|
||||||
|
|
||||||
typedef PVOID RTL_SRWLOCK;
|
|
||||||
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int (WSAAPI* LPFN_WSARECV)
|
|
||||||
(SOCKET socket,
|
|
||||||
LPWSABUF buffers,
|
|
||||||
DWORD buffer_count,
|
|
||||||
LPDWORD bytes,
|
|
||||||
LPDWORD flags,
|
|
||||||
LPWSAOVERLAPPED overlapped,
|
|
||||||
LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
|
|
||||||
|
|
||||||
typedef int (WSAAPI* LPFN_WSARECVFROM)
|
|
||||||
(SOCKET socket,
|
|
||||||
LPWSABUF buffers,
|
|
||||||
DWORD buffer_count,
|
|
||||||
LPDWORD bytes,
|
|
||||||
LPDWORD flags,
|
|
||||||
struct sockaddr* addr,
|
|
||||||
LPINT addr_len,
|
|
||||||
LPWSAOVERLAPPED overlapped,
|
|
||||||
LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
|
|
||||||
|
|
||||||
#ifndef _NTDEF_
|
|
||||||
typedef LONG NTSTATUS;
|
|
||||||
typedef NTSTATUS *PNTSTATUS;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RTL_CONDITION_VARIABLE_INIT
|
|
||||||
typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct _AFD_POLL_HANDLE_INFO {
|
|
||||||
HANDLE Handle;
|
|
||||||
ULONG Events;
|
|
||||||
NTSTATUS Status;
|
|
||||||
} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
|
|
||||||
|
|
||||||
typedef struct _AFD_POLL_INFO {
|
|
||||||
LARGE_INTEGER Timeout;
|
|
||||||
ULONG NumberOfHandles;
|
|
||||||
ULONG Exclusive;
|
|
||||||
AFD_POLL_HANDLE_INFO Handles[1];
|
|
||||||
} AFD_POLL_INFO, *PAFD_POLL_INFO;
|
|
||||||
|
|
||||||
#define UV_MSAFD_PROVIDER_COUNT 3
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* It should be possible to cast uv_buf_t[] to WSABUF[]
|
|
||||||
* see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx
|
|
||||||
*/
|
|
||||||
typedef struct uv_buf_t {
|
|
||||||
ULONG len;
|
|
||||||
char* base;
|
|
||||||
} uv_buf_t;
|
|
||||||
|
|
||||||
typedef int uv_file;
|
|
||||||
typedef SOCKET uv_os_sock_t;
|
|
||||||
typedef HANDLE uv_os_fd_t;
|
|
||||||
typedef int uv_pid_t;
|
|
||||||
|
|
||||||
typedef HANDLE uv_thread_t;
|
|
||||||
|
|
||||||
typedef HANDLE uv_sem_t;
|
|
||||||
|
|
||||||
typedef CRITICAL_SECTION uv_mutex_t;
|
|
||||||
|
|
||||||
/* This condition variable implementation is based on the SetEvent solution
|
|
||||||
* (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
|
|
||||||
* We could not use the SignalObjectAndWait solution (section 3.4) because
|
|
||||||
* it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and
|
|
||||||
* uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
CONDITION_VARIABLE cond_var;
|
|
||||||
struct {
|
|
||||||
unsigned int waiters_count;
|
|
||||||
CRITICAL_SECTION waiters_count_lock;
|
|
||||||
HANDLE signal_event;
|
|
||||||
HANDLE broadcast_event;
|
|
||||||
} unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */
|
|
||||||
} uv_cond_t;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
unsigned int num_readers_;
|
|
||||||
CRITICAL_SECTION num_readers_lock_;
|
|
||||||
HANDLE write_semaphore_;
|
|
||||||
} state_;
|
|
||||||
/* TODO: remove me in v2.x. */
|
|
||||||
struct {
|
|
||||||
SRWLOCK unused_;
|
|
||||||
} unused1_;
|
|
||||||
/* TODO: remove me in v2.x. */
|
|
||||||
struct {
|
|
||||||
uv_mutex_t unused1_;
|
|
||||||
uv_mutex_t unused2_;
|
|
||||||
} unused2_;
|
|
||||||
} uv_rwlock_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int n;
|
|
||||||
unsigned int count;
|
|
||||||
uv_mutex_t mutex;
|
|
||||||
uv_sem_t turnstile1;
|
|
||||||
uv_sem_t turnstile2;
|
|
||||||
} uv_barrier_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
DWORD tls_index;
|
|
||||||
} uv_key_t;
|
|
||||||
|
|
||||||
#define UV_ONCE_INIT { 0, NULL }
|
|
||||||
|
|
||||||
typedef struct uv_once_s {
|
|
||||||
unsigned char ran;
|
|
||||||
HANDLE event;
|
|
||||||
} uv_once_t;
|
|
||||||
|
|
||||||
/* Platform-specific definitions for uv_spawn support. */
|
|
||||||
typedef unsigned char uv_uid_t;
|
|
||||||
typedef unsigned char uv_gid_t;
|
|
||||||
|
|
||||||
typedef struct uv__dirent_s {
|
|
||||||
int d_type;
|
|
||||||
char d_name[1];
|
|
||||||
} uv__dirent_t;
|
|
||||||
|
|
||||||
#define UV_DIR_PRIVATE_FIELDS \
|
|
||||||
HANDLE dir_handle; \
|
|
||||||
WIN32_FIND_DATAW find_data; \
|
|
||||||
BOOL need_find_call;
|
|
||||||
|
|
||||||
#define HAVE_DIRENT_TYPES
|
|
||||||
#define UV__DT_DIR UV_DIRENT_DIR
|
|
||||||
#define UV__DT_FILE UV_DIRENT_FILE
|
|
||||||
#define UV__DT_LINK UV_DIRENT_LINK
|
|
||||||
#define UV__DT_FIFO UV_DIRENT_FIFO
|
|
||||||
#define UV__DT_SOCKET UV_DIRENT_SOCKET
|
|
||||||
#define UV__DT_CHAR UV_DIRENT_CHAR
|
|
||||||
#define UV__DT_BLOCK UV_DIRENT_BLOCK
|
|
||||||
|
|
||||||
/* Platform-specific definitions for uv_dlopen support. */
|
|
||||||
#define UV_DYNAMIC FAR WINAPI
|
|
||||||
typedef struct {
|
|
||||||
HMODULE handle;
|
|
||||||
char* errmsg;
|
|
||||||
} uv_lib_t;
|
|
||||||
|
|
||||||
#define UV_LOOP_PRIVATE_FIELDS \
|
|
||||||
/* The loop's I/O completion port */ \
|
|
||||||
HANDLE iocp; \
|
|
||||||
/* The current time according to the event loop. in msecs. */ \
|
|
||||||
uint64_t time; \
|
|
||||||
/* Tail of a single-linked circular queue of pending reqs. If the queue */ \
|
|
||||||
/* is empty, tail_ is NULL. If there is only one item, */ \
|
|
||||||
/* tail_->next_req == tail_ */ \
|
|
||||||
uv_req_t* pending_reqs_tail; \
|
|
||||||
/* Head of a single-linked list of closed handles */ \
|
|
||||||
uv_handle_t* endgame_handles; \
|
|
||||||
/* TODO(bnoordhuis) Stop heap-allocating |timer_heap| in libuv v2.x. */ \
|
|
||||||
void* timer_heap; \
|
|
||||||
/* Lists of active loop (prepare / check / idle) watchers */ \
|
|
||||||
uv_prepare_t* prepare_handles; \
|
|
||||||
uv_check_t* check_handles; \
|
|
||||||
uv_idle_t* idle_handles; \
|
|
||||||
/* This pointer will refer to the prepare/check/idle handle whose */ \
|
|
||||||
/* callback is scheduled to be called next. This is needed to allow */ \
|
|
||||||
/* safe removal from one of the lists above while that list being */ \
|
|
||||||
/* iterated over. */ \
|
|
||||||
uv_prepare_t* next_prepare_handle; \
|
|
||||||
uv_check_t* next_check_handle; \
|
|
||||||
uv_idle_t* next_idle_handle; \
|
|
||||||
/* This handle holds the peer sockets for the fast variant of uv_poll_t */ \
|
|
||||||
SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \
|
|
||||||
/* Counter to keep track of active tcp streams */ \
|
|
||||||
unsigned int active_tcp_streams; \
|
|
||||||
/* Counter to keep track of active udp streams */ \
|
|
||||||
unsigned int active_udp_streams; \
|
|
||||||
/* Counter to started timer */ \
|
|
||||||
uint64_t timer_counter; \
|
|
||||||
/* Threadpool */ \
|
|
||||||
void* wq[2]; \
|
|
||||||
uv_mutex_t wq_mutex; \
|
|
||||||
uv_async_t wq_async;
|
|
||||||
|
|
||||||
#define UV_REQ_TYPE_PRIVATE \
|
|
||||||
/* TODO: remove the req suffix */ \
|
|
||||||
UV_ACCEPT, \
|
|
||||||
UV_FS_EVENT_REQ, \
|
|
||||||
UV_POLL_REQ, \
|
|
||||||
UV_PROCESS_EXIT, \
|
|
||||||
UV_READ, \
|
|
||||||
UV_UDP_RECV, \
|
|
||||||
UV_WAKEUP, \
|
|
||||||
UV_SIGNAL_REQ,
|
|
||||||
|
|
||||||
#define UV_REQ_PRIVATE_FIELDS \
|
|
||||||
union { \
|
|
||||||
/* Used by I/O operations */ \
|
|
||||||
struct { \
|
|
||||||
OVERLAPPED overlapped; \
|
|
||||||
size_t queued_bytes; \
|
|
||||||
} io; \
|
|
||||||
} u; \
|
|
||||||
struct uv_req_s* next_req;
|
|
||||||
|
|
||||||
#define UV_WRITE_PRIVATE_FIELDS \
|
|
||||||
int coalesced; \
|
|
||||||
uv_buf_t write_buffer; \
|
|
||||||
HANDLE event_handle; \
|
|
||||||
HANDLE wait_handle;
|
|
||||||
|
|
||||||
#define UV_CONNECT_PRIVATE_FIELDS \
|
|
||||||
/* empty */
|
|
||||||
|
|
||||||
#define UV_SHUTDOWN_PRIVATE_FIELDS \
|
|
||||||
/* empty */
|
|
||||||
|
|
||||||
#define UV_UDP_SEND_PRIVATE_FIELDS \
|
|
||||||
/* empty */
|
|
||||||
|
|
||||||
#define UV_PRIVATE_REQ_TYPES \
|
|
||||||
typedef struct uv_pipe_accept_s { \
|
|
||||||
UV_REQ_FIELDS \
|
|
||||||
HANDLE pipeHandle; \
|
|
||||||
struct uv_pipe_accept_s* next_pending; \
|
|
||||||
} uv_pipe_accept_t; \
|
|
||||||
\
|
|
||||||
typedef struct uv_tcp_accept_s { \
|
|
||||||
UV_REQ_FIELDS \
|
|
||||||
SOCKET accept_socket; \
|
|
||||||
char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \
|
|
||||||
HANDLE event_handle; \
|
|
||||||
HANDLE wait_handle; \
|
|
||||||
struct uv_tcp_accept_s* next_pending; \
|
|
||||||
} uv_tcp_accept_t; \
|
|
||||||
\
|
|
||||||
typedef struct uv_read_s { \
|
|
||||||
UV_REQ_FIELDS \
|
|
||||||
HANDLE event_handle; \
|
|
||||||
HANDLE wait_handle; \
|
|
||||||
} uv_read_t;
|
|
||||||
|
|
||||||
#define uv_stream_connection_fields \
|
|
||||||
unsigned int write_reqs_pending; \
|
|
||||||
uv_shutdown_t* shutdown_req;
|
|
||||||
|
|
||||||
#define uv_stream_server_fields \
|
|
||||||
uv_connection_cb connection_cb;
|
|
||||||
|
|
||||||
#define UV_STREAM_PRIVATE_FIELDS \
|
|
||||||
unsigned int reqs_pending; \
|
|
||||||
int activecnt; \
|
|
||||||
uv_read_t read_req; \
|
|
||||||
union { \
|
|
||||||
struct { uv_stream_connection_fields } conn; \
|
|
||||||
struct { uv_stream_server_fields } serv; \
|
|
||||||
} stream;
|
|
||||||
|
|
||||||
#define uv_tcp_server_fields \
|
|
||||||
uv_tcp_accept_t* accept_reqs; \
|
|
||||||
unsigned int processed_accepts; \
|
|
||||||
uv_tcp_accept_t* pending_accepts; \
|
|
||||||
LPFN_ACCEPTEX func_acceptex;
|
|
||||||
|
|
||||||
#define uv_tcp_connection_fields \
|
|
||||||
uv_buf_t read_buffer; \
|
|
||||||
LPFN_CONNECTEX func_connectex;
|
|
||||||
|
|
||||||
#define UV_TCP_PRIVATE_FIELDS \
|
|
||||||
SOCKET socket; \
|
|
||||||
int delayed_error; \
|
|
||||||
union { \
|
|
||||||
struct { uv_tcp_server_fields } serv; \
|
|
||||||
struct { uv_tcp_connection_fields } conn; \
|
|
||||||
} tcp;
|
|
||||||
|
|
||||||
#define UV_UDP_PRIVATE_FIELDS \
|
|
||||||
SOCKET socket; \
|
|
||||||
unsigned int reqs_pending; \
|
|
||||||
int activecnt; \
|
|
||||||
uv_req_t recv_req; \
|
|
||||||
uv_buf_t recv_buffer; \
|
|
||||||
struct sockaddr_storage recv_from; \
|
|
||||||
int recv_from_len; \
|
|
||||||
uv_udp_recv_cb recv_cb; \
|
|
||||||
uv_alloc_cb alloc_cb; \
|
|
||||||
LPFN_WSARECV func_wsarecv; \
|
|
||||||
LPFN_WSARECVFROM func_wsarecvfrom;
|
|
||||||
|
|
||||||
#define uv_pipe_server_fields \
|
|
||||||
int pending_instances; \
|
|
||||||
uv_pipe_accept_t* accept_reqs; \
|
|
||||||
uv_pipe_accept_t* pending_accepts;
|
|
||||||
|
|
||||||
#define uv_pipe_connection_fields \
|
|
||||||
uv_timer_t* eof_timer; \
|
|
||||||
uv_write_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
|
|
||||||
DWORD ipc_remote_pid; \
|
|
||||||
union { \
|
|
||||||
uint32_t payload_remaining; \
|
|
||||||
uint64_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
|
|
||||||
} ipc_data_frame; \
|
|
||||||
void* ipc_xfer_queue[2]; \
|
|
||||||
int ipc_xfer_queue_length; \
|
|
||||||
uv_write_t* non_overlapped_writes_tail; \
|
|
||||||
CRITICAL_SECTION readfile_thread_lock; \
|
|
||||||
volatile HANDLE readfile_thread_handle;
|
|
||||||
|
|
||||||
#define UV_PIPE_PRIVATE_FIELDS \
|
|
||||||
HANDLE handle; \
|
|
||||||
WCHAR* name; \
|
|
||||||
union { \
|
|
||||||
struct { uv_pipe_server_fields } serv; \
|
|
||||||
struct { uv_pipe_connection_fields } conn; \
|
|
||||||
} pipe;
|
|
||||||
|
|
||||||
/* TODO: put the parser states in an union - TTY handles are always half-duplex
|
|
||||||
* so read-state can safely overlap write-state. */
|
|
||||||
#define UV_TTY_PRIVATE_FIELDS \
|
|
||||||
HANDLE handle; \
|
|
||||||
union { \
|
|
||||||
struct { \
|
|
||||||
/* Used for readable TTY handles */ \
|
|
||||||
/* TODO: remove me in v2.x. */ \
|
|
||||||
HANDLE unused_; \
|
|
||||||
uv_buf_t read_line_buffer; \
|
|
||||||
HANDLE read_raw_wait; \
|
|
||||||
/* Fields used for translating win keystrokes into vt100 characters */ \
|
|
||||||
char last_key[8]; \
|
|
||||||
unsigned char last_key_offset; \
|
|
||||||
unsigned char last_key_len; \
|
|
||||||
WCHAR last_utf16_high_surrogate; \
|
|
||||||
INPUT_RECORD last_input_record; \
|
|
||||||
} rd; \
|
|
||||||
struct { \
|
|
||||||
/* Used for writable TTY handles */ \
|
|
||||||
/* utf8-to-utf16 conversion state */ \
|
|
||||||
unsigned int utf8_codepoint; \
|
|
||||||
unsigned char utf8_bytes_left; \
|
|
||||||
/* eol conversion state */ \
|
|
||||||
unsigned char previous_eol; \
|
|
||||||
/* ansi parser state */ \
|
|
||||||
unsigned short ansi_parser_state; \
|
|
||||||
unsigned char ansi_csi_argc; \
|
|
||||||
unsigned short ansi_csi_argv[4]; \
|
|
||||||
COORD saved_position; \
|
|
||||||
WORD saved_attributes; \
|
|
||||||
} wr; \
|
|
||||||
} tty;
|
|
||||||
|
|
||||||
#define UV_POLL_PRIVATE_FIELDS \
|
|
||||||
SOCKET socket; \
|
|
||||||
/* Used in fast mode */ \
|
|
||||||
SOCKET peer_socket; \
|
|
||||||
AFD_POLL_INFO afd_poll_info_1; \
|
|
||||||
AFD_POLL_INFO afd_poll_info_2; \
|
|
||||||
/* Used in fast and slow mode. */ \
|
|
||||||
uv_req_t poll_req_1; \
|
|
||||||
uv_req_t poll_req_2; \
|
|
||||||
unsigned char submitted_events_1; \
|
|
||||||
unsigned char submitted_events_2; \
|
|
||||||
unsigned char mask_events_1; \
|
|
||||||
unsigned char mask_events_2; \
|
|
||||||
unsigned char events;
|
|
||||||
|
|
||||||
#define UV_TIMER_PRIVATE_FIELDS \
|
|
||||||
void* heap_node[3]; \
|
|
||||||
int unused; \
|
|
||||||
uint64_t timeout; \
|
|
||||||
uint64_t repeat; \
|
|
||||||
uint64_t start_id; \
|
|
||||||
uv_timer_cb timer_cb;
|
|
||||||
|
|
||||||
#define UV_ASYNC_PRIVATE_FIELDS \
|
|
||||||
struct uv_req_s async_req; \
|
|
||||||
uv_async_cb async_cb; \
|
|
||||||
/* char to avoid alignment issues */ \
|
|
||||||
char volatile async_sent;
|
|
||||||
|
|
||||||
#define UV_PREPARE_PRIVATE_FIELDS \
|
|
||||||
uv_prepare_t* prepare_prev; \
|
|
||||||
uv_prepare_t* prepare_next; \
|
|
||||||
uv_prepare_cb prepare_cb;
|
|
||||||
|
|
||||||
#define UV_CHECK_PRIVATE_FIELDS \
|
|
||||||
uv_check_t* check_prev; \
|
|
||||||
uv_check_t* check_next; \
|
|
||||||
uv_check_cb check_cb;
|
|
||||||
|
|
||||||
#define UV_IDLE_PRIVATE_FIELDS \
|
|
||||||
uv_idle_t* idle_prev; \
|
|
||||||
uv_idle_t* idle_next; \
|
|
||||||
uv_idle_cb idle_cb;
|
|
||||||
|
|
||||||
#define UV_HANDLE_PRIVATE_FIELDS \
|
|
||||||
uv_handle_t* endgame_next; \
|
|
||||||
unsigned int flags;
|
|
||||||
|
|
||||||
#define UV_GETADDRINFO_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
uv_getaddrinfo_cb getaddrinfo_cb; \
|
|
||||||
void* alloc; \
|
|
||||||
WCHAR* node; \
|
|
||||||
WCHAR* service; \
|
|
||||||
/* The addrinfoW field is used to store a pointer to the hints, and */ \
|
|
||||||
/* later on to store the result of GetAddrInfoW. The final result will */ \
|
|
||||||
/* be converted to struct addrinfo* and stored in the addrinfo field. */ \
|
|
||||||
struct addrinfoW* addrinfow; \
|
|
||||||
struct addrinfo* addrinfo; \
|
|
||||||
int retcode;
|
|
||||||
|
|
||||||
#define UV_GETNAMEINFO_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
uv_getnameinfo_cb getnameinfo_cb; \
|
|
||||||
struct sockaddr_storage storage; \
|
|
||||||
int flags; \
|
|
||||||
char host[NI_MAXHOST]; \
|
|
||||||
char service[NI_MAXSERV]; \
|
|
||||||
int retcode;
|
|
||||||
|
|
||||||
#define UV_PROCESS_PRIVATE_FIELDS \
|
|
||||||
struct uv_process_exit_s { \
|
|
||||||
UV_REQ_FIELDS \
|
|
||||||
} exit_req; \
|
|
||||||
BYTE* child_stdio_buffer; \
|
|
||||||
int exit_signal; \
|
|
||||||
HANDLE wait_handle; \
|
|
||||||
HANDLE process_handle; \
|
|
||||||
volatile char exit_cb_pending;
|
|
||||||
|
|
||||||
#define UV_FS_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req; \
|
|
||||||
int flags; \
|
|
||||||
DWORD sys_errno_; \
|
|
||||||
union { \
|
|
||||||
/* TODO: remove me in 0.9. */ \
|
|
||||||
WCHAR* pathw; \
|
|
||||||
int fd; \
|
|
||||||
} file; \
|
|
||||||
union { \
|
|
||||||
struct { \
|
|
||||||
int mode; \
|
|
||||||
WCHAR* new_pathw; \
|
|
||||||
int file_flags; \
|
|
||||||
int fd_out; \
|
|
||||||
unsigned int nbufs; \
|
|
||||||
uv_buf_t* bufs; \
|
|
||||||
int64_t offset; \
|
|
||||||
uv_buf_t bufsml[4]; \
|
|
||||||
} info; \
|
|
||||||
struct { \
|
|
||||||
double atime; \
|
|
||||||
double mtime; \
|
|
||||||
} time; \
|
|
||||||
} fs;
|
|
||||||
|
|
||||||
#define UV_WORK_PRIVATE_FIELDS \
|
|
||||||
struct uv__work work_req;
|
|
||||||
|
|
||||||
#define UV_FS_EVENT_PRIVATE_FIELDS \
|
|
||||||
struct uv_fs_event_req_s { \
|
|
||||||
UV_REQ_FIELDS \
|
|
||||||
} req; \
|
|
||||||
HANDLE dir_handle; \
|
|
||||||
int req_pending; \
|
|
||||||
uv_fs_event_cb cb; \
|
|
||||||
WCHAR* filew; \
|
|
||||||
WCHAR* short_filew; \
|
|
||||||
WCHAR* dirw; \
|
|
||||||
char* buffer;
|
|
||||||
|
|
||||||
#define UV_SIGNAL_PRIVATE_FIELDS \
|
|
||||||
RB_ENTRY(uv_signal_s) tree_entry; \
|
|
||||||
struct uv_req_s signal_req; \
|
|
||||||
unsigned long pending_signum;
|
|
||||||
|
|
||||||
#ifndef F_OK
|
|
||||||
#define F_OK 0
|
|
||||||
#endif
|
|
||||||
#ifndef R_OK
|
|
||||||
#define R_OK 4
|
|
||||||
#endif
|
|
||||||
#ifndef W_OK
|
|
||||||
#define W_OK 2
|
|
||||||
#endif
|
|
||||||
#ifndef X_OK
|
|
||||||
#define X_OK 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* fs open() flags supported on this platform: */
|
|
||||||
#define UV_FS_O_APPEND _O_APPEND
|
|
||||||
#define UV_FS_O_CREAT _O_CREAT
|
|
||||||
#define UV_FS_O_EXCL _O_EXCL
|
|
||||||
#define UV_FS_O_FILEMAP 0x20000000
|
|
||||||
#define UV_FS_O_RANDOM _O_RANDOM
|
|
||||||
#define UV_FS_O_RDONLY _O_RDONLY
|
|
||||||
#define UV_FS_O_RDWR _O_RDWR
|
|
||||||
#define UV_FS_O_SEQUENTIAL _O_SEQUENTIAL
|
|
||||||
#define UV_FS_O_SHORT_LIVED _O_SHORT_LIVED
|
|
||||||
#define UV_FS_O_TEMPORARY _O_TEMPORARY
|
|
||||||
#define UV_FS_O_TRUNC _O_TRUNC
|
|
||||||
#define UV_FS_O_WRONLY _O_WRONLY
|
|
||||||
|
|
||||||
/* fs open() flags supported on other platforms (or mapped on this platform): */
|
|
||||||
#define UV_FS_O_DIRECT 0x02000000 /* FILE_FLAG_NO_BUFFERING */
|
|
||||||
#define UV_FS_O_DIRECTORY 0
|
|
||||||
#define UV_FS_O_DSYNC 0x04000000 /* FILE_FLAG_WRITE_THROUGH */
|
|
||||||
#define UV_FS_O_EXLOCK 0x10000000 /* EXCLUSIVE SHARING MODE */
|
|
||||||
#define UV_FS_O_NOATIME 0
|
|
||||||
#define UV_FS_O_NOCTTY 0
|
|
||||||
#define UV_FS_O_NOFOLLOW 0
|
|
||||||
#define UV_FS_O_NONBLOCK 0
|
|
||||||
#define UV_FS_O_SYMLINK 0
|
|
||||||
#define UV_FS_O_SYNC 0x08000000 /* FILE_FLAG_WRITE_THROUGH */
|
|
||||||
Binary file not shown.
+103
@@ -0,0 +1,103 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
//#include "resource.h"
|
||||||
|
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
|
//
|
||||||
|
#include "winres.h"
|
||||||
|
|
||||||
|
#include <sourcemod_version.h>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// English (U.S.) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION SM_VERSION_FILE
|
||||||
|
PRODUCTVERSION SM_VERSION_FILE
|
||||||
|
FILEFLAGSMASK 0x17L
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x4L
|
||||||
|
FILETYPE 0x2L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "000004b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Comments", "SourceMod Extension"
|
||||||
|
VALUE "FileDescription", "SourceMod Extension"
|
||||||
|
VALUE "FileVersion", SM_VERSION_STRING
|
||||||
|
VALUE "InternalName", "SourceMod Extension"
|
||||||
|
VALUE "LegalCopyright", "Copyright (c) 2004-2022, AlliedModders LLC"
|
||||||
|
VALUE "OriginalFilename", BINARY_NAME
|
||||||
|
VALUE "ProductName", "SourceMod Extension"
|
||||||
|
VALUE "ProductVersion", SM_VERSION_STRING
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x0, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"#include ""winres.h""\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#endif // English (U.S.) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
Reference in New Issue
Block a user