add libuv test
parent
27b515b763
commit
6b0e58726e
|
@ -0,0 +1,14 @@
|
||||||
|
cmake_minimum_required(VERSION 3.12)
|
||||||
|
project(cpp11)
|
||||||
|
add_definitions(-std=c++11)
|
||||||
|
|
||||||
|
message("current dir" ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
# set(CMAKE_CXX_FLAGS "-fno-elide-constructors")
|
||||||
|
message(info ${SOURCE})
|
||||||
|
link_directories("./third/lib")
|
||||||
|
|
||||||
|
link_libraries(uv.lib)
|
||||||
|
|
||||||
|
add_executable(uv_test test.cpp )
|
||||||
|
include_directories("./third/include")
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <uv.h>
|
||||||
|
#include <functional>
|
||||||
|
#include <thread>
|
||||||
|
#include <iostream>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
uv_async_t async;
|
||||||
|
uv_async_t async2;
|
||||||
|
|
||||||
|
uv_loop_t* loop;
|
||||||
|
|
||||||
|
void close_cb(uv_handle_t* handle);
|
||||||
|
void async_cb(uv_async_t* handle, int status);
|
||||||
|
|
||||||
|
void close_cb(uv_handle_t* handle)
|
||||||
|
{
|
||||||
|
printf("close the async handle!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void async_cb(uv_async_t* handle)
|
||||||
|
{
|
||||||
|
int id = GetCurrentThreadId();
|
||||||
|
printf("async_cb called!\n");
|
||||||
|
printf("thread id:%lu.\n", id);
|
||||||
|
//uv_close((uv_handle_t*)&async, close_cb); //如果async没有关闭,消息队列是会阻塞的
|
||||||
|
}
|
||||||
|
|
||||||
|
void async_cb2(uv_async_t* handle)
|
||||||
|
{
|
||||||
|
int id = GetCurrentThreadId();
|
||||||
|
printf("async_cb2 called!\n");
|
||||||
|
printf("thread id:%lu.\n", id);
|
||||||
|
//uv_close((uv_handle_t*)&async, close_cb); //如果async没有关闭,消息队列是会阻塞的
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
loop = uv_default_loop();
|
||||||
|
|
||||||
|
uv_thread_t id = uv_thread_self();
|
||||||
|
printf("thread id:%lu.\n", id);
|
||||||
|
|
||||||
|
uv_async_init(loop, &async, async_cb);
|
||||||
|
uv_async_init(loop, &async2, async_cb2);
|
||||||
|
|
||||||
|
uv_async_send(&async);
|
||||||
|
|
||||||
|
std::thread t1([]()->int{
|
||||||
|
Sleep(2000);
|
||||||
|
std::cout<<"start\r\n";
|
||||||
|
int id = GetCurrentThreadId();
|
||||||
|
printf("thread id:%lu.\n", id);
|
||||||
|
uv_async_send(&async);
|
||||||
|
Sleep(1000);
|
||||||
|
uv_async_send(&async2);
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
t1.detach();
|
||||||
|
uv_run(loop, UV_RUN_DEFAULT);
|
||||||
|
return 0;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* 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
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,448 @@
|
||||||
|
/* 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 UV__ERR(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_ */
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,33 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* 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 */
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* 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_ */
|
|
@ -0,0 +1,768 @@
|
||||||
|
/*-
|
||||||
|
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
|
||||||
|
* 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_ */
|
|
@ -0,0 +1,496 @@
|
||||||
|
/* 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"
|
||||||
|
#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_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)
|
||||||
|
typedef struct {
|
||||||
|
uv_mutex_t mutex;
|
||||||
|
uv_cond_t cond;
|
||||||
|
unsigned threshold;
|
||||||
|
unsigned in;
|
||||||
|
unsigned out;
|
||||||
|
} 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_os_fd_t 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 btime; \
|
||||||
|
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 */
|
|
@ -0,0 +1,43 @@
|
||||||
|
/* 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 2
|
||||||
|
#define UV_VERSION_MINOR 0
|
||||||
|
#define UV_VERSION_PATCH 0
|
||||||
|
#define UV_VERSION_IS_RELEASE 0
|
||||||
|
#define UV_VERSION_SUFFIX "dev"
|
||||||
|
|
||||||
|
#define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \
|
||||||
|
(UV_VERSION_MINOR << 8) | \
|
||||||
|
(UV_VERSION_PATCH))
|
||||||
|
|
||||||
|
#endif /* UV_VERSION_H */
|
|
@ -0,0 +1,546 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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>
|
||||||
|
|
||||||
|
#ifndef LOCALE_INVARIANT
|
||||||
|
# define LOCALE_INVARIANT 0x007f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <mswsock.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "uv/tree.h"
|
||||||
|
#include "uv/threadpool.h"
|
||||||
|
|
||||||
|
#define MAX_PIPENAME_LEN 256
|
||||||
|
|
||||||
|
#ifndef S_IFLNK
|
||||||
|
# define S_IFLNK 0xA000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Signals supported by uv_signal and or uv_kill */
|
||||||
|
#define SIGHUP 1
|
||||||
|
#define SIGINT 2
|
||||||
|
#define SIGILL 4
|
||||||
|
#define SIGABRT_COMPAT 6
|
||||||
|
#define SIGFPE 8
|
||||||
|
#define SIGKILL 9
|
||||||
|
#define SIGSEGV 11
|
||||||
|
#define SIGTERM 15
|
||||||
|
#define SIGBREAK 21
|
||||||
|
#define SIGABRT 22
|
||||||
|
#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
|
||||||
|
|
||||||
|
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 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;
|
||||||
|
|
||||||
|
typedef CONDITION_VARIABLE uv_cond_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int num_readers_;
|
||||||
|
CRITICAL_SECTION num_readers_lock_;
|
||||||
|
HANDLE write_semaphore_;
|
||||||
|
} 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; \
|
||||||
|
/* Timers */ \
|
||||||
|
struct { \
|
||||||
|
void* min; \
|
||||||
|
unsigned int nelts; \
|
||||||
|
} timer_heap; \
|
||||||
|
uint64_t timer_counter; \
|
||||||
|
/* Lists of active loop (prepare / check / idle) watchers */ \
|
||||||
|
void* prepare_handles[2]; \
|
||||||
|
void* check_handles[2]; \
|
||||||
|
void* idle_handles[2]; \
|
||||||
|
/* This handle holds the peer sockets for the fast variant of uv_poll_t */ \
|
||||||
|
SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \
|
||||||
|
/* Threadpool */ \
|
||||||
|
void* wq[2]; \
|
||||||
|
uv_mutex_t wq_mutex; \
|
||||||
|
uv_async_t wq_async; \
|
||||||
|
/* Async handle */ \
|
||||||
|
struct uv_req_s async_req; \
|
||||||
|
void* async_handles[2]; \
|
||||||
|
/* Global queue of loops */ \
|
||||||
|
void* loops_queue[2];
|
||||||
|
|
||||||
|
#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_tcp_accept_t* dummy1; /* Mirror of union field, keep as NULL */ \
|
||||||
|
unsigned int dummy2; /* Mirror of union field, keep as 0 */ \
|
||||||
|
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; \
|
||||||
|
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; \
|
||||||
|
DWORD ipc_remote_pid; \
|
||||||
|
struct { \
|
||||||
|
uint32_t payload_remaining; \
|
||||||
|
} 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 */ \
|
||||||
|
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 \
|
||||||
|
uv_timer_cb timer_cb; \
|
||||||
|
void* heap_node[3]; \
|
||||||
|
uint64_t timeout; \
|
||||||
|
uint64_t repeat; \
|
||||||
|
uint64_t start_id;
|
||||||
|
|
||||||
|
#define UV_ASYNC_PRIVATE_FIELDS \
|
||||||
|
void* queue[2]; \
|
||||||
|
uv_async_cb async_cb; \
|
||||||
|
LONG volatile async_sent;
|
||||||
|
|
||||||
|
#define UV_PREPARE_PRIVATE_FIELDS \
|
||||||
|
void* queue[2]; \
|
||||||
|
uv_prepare_cb prepare_cb;
|
||||||
|
|
||||||
|
#define UV_CHECK_PRIVATE_FIELDS \
|
||||||
|
void* queue[2]; \
|
||||||
|
uv_check_cb check_cb;
|
||||||
|
|
||||||
|
#define UV_IDLE_PRIVATE_FIELDS \
|
||||||
|
void* queue[2]; \
|
||||||
|
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; \
|
||||||
|
HANDLE hFile; \
|
||||||
|
} file; \
|
||||||
|
union { \
|
||||||
|
struct { \
|
||||||
|
int mode; \
|
||||||
|
WCHAR* new_pathw; \
|
||||||
|
int file_flags; \
|
||||||
|
HANDLE hFile_out; \
|
||||||
|
unsigned int nbufs; \
|
||||||
|
uv_buf_t* bufs; \
|
||||||
|
int64_t offset; \
|
||||||
|
uv_buf_t bufsml[4]; \
|
||||||
|
} info; \
|
||||||
|
struct { \
|
||||||
|
double btime; \
|
||||||
|
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 0x0008
|
||||||
|
#define UV_FS_O_CREAT 0x0100
|
||||||
|
#define UV_FS_O_EXCL 0x0400
|
||||||
|
#define UV_FS_O_FILEMAP 0x20000000
|
||||||
|
#define UV_FS_O_RANDOM 0x0010
|
||||||
|
#define UV_FS_O_RDONLY 0x0000
|
||||||
|
#define UV_FS_O_RDWR 0x0002
|
||||||
|
#define UV_FS_O_SEQUENTIAL 0x0020
|
||||||
|
#define UV_FS_O_SHORT_LIVED 0x1000
|
||||||
|
#define UV_FS_O_TEMPORARY 0x0040
|
||||||
|
#define UV_FS_O_TRUNC 0x0200
|
||||||
|
#define UV_FS_O_WRONLY 0x0001
|
||||||
|
|
||||||
|
/* 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 */
|
Loading…
Reference in New Issue