diff --git a/config-unix.mk b/config-unix.mk index e633d8d8..2af3f3c4 100644 --- a/config-unix.mk +++ b/config-unix.mk @@ -35,6 +35,7 @@ OBJS += src/unix/dl.o OBJS += src/unix/error.o OBJS += src/unix/fs.o OBJS += src/unix/idle.o +OBJS += src/unix/loop.o OBJS += src/unix/pipe.o OBJS += src/unix/prepare.o OBJS += src/unix/process.o diff --git a/src/unix/core.c b/src/unix/core.c index 56eb9b95..5d5048ad 100644 --- a/src/unix/core.c +++ b/src/unix/core.c @@ -123,20 +123,14 @@ int uv_is_closing(uv_handle_t* handle) { } -static int uv__loop_init(uv_loop_t* loop, - struct ev_loop *(ev_loop_new)(unsigned int flags)) { - memset(loop, 0, sizeof(*loop)); - RB_INIT(&loop->uv_ares_handles_); - loop->endgame_handles = NULL; -#if HAVE_KQUEUE - loop->ev = ev_loop_new(EVBACKEND_KQUEUE); -#else - loop->ev = ev_loop_new(EVFLAG_AUTO); -#endif - ev_set_userdata(loop->ev, loop); - eio_channel_init(&loop->uv_eio_channel, loop); - uv__loop_platform_init(loop); - return 0; +uv_loop_t* uv_default_loop(void) { + if (default_loop_ptr) + return default_loop_ptr; + + if (uv__loop_init(&default_loop_struct, /* default_loop? */ 1)) + return NULL; + + return (default_loop_ptr = &default_loop_struct); } @@ -146,7 +140,7 @@ uv_loop_t* uv_loop_new(void) { if ((loop = malloc(sizeof(*loop))) == NULL) return NULL; - if (uv__loop_init(loop, ev_loop_new)) { + if (uv__loop_init(loop, /* default_loop? */ 0)) { free(loop); return NULL; } @@ -156,9 +150,7 @@ uv_loop_t* uv_loop_new(void) { void uv_loop_delete(uv_loop_t* loop) { - uv_ares_destroy(loop, loop->channel); - ev_loop_destroy(loop->ev); - uv__loop_platform_delete(loop); + uv__loop_delete(loop); #ifndef NDEBUG memset(loop, -1, sizeof *loop); #endif @@ -174,18 +166,6 @@ int uv_loop_refcount(const uv_loop_t* loop) { } -uv_loop_t* uv_default_loop(void) { - if (default_loop_ptr) - return default_loop_ptr; - - if (uv__loop_init(&default_loop_struct, ev_default_loop)) - return NULL; - - default_loop_ptr = &default_loop_struct; - return default_loop_ptr; -} - - void uv__run(uv_loop_t* loop) { ev_run(loop->ev, EVRUN_ONCE); diff --git a/src/unix/internal.h b/src/unix/internal.h index 5123d0ee..cfbe1add 100644 --- a/src/unix/internal.h +++ b/src/unix/internal.h @@ -104,6 +104,10 @@ int uv__cloexec(int fd, int set) __attribute__((unused)); int uv__socket(int domain, int type, int protocol); int uv__dup(int fd); +/* loop */ +int uv__loop_init(uv_loop_t* loop, int default_loop); +void uv__loop_delete(uv_loop_t* loop); + /* error */ uv_err_code uv_translate_sys_error(int sys_errno); void uv_fatal_error(const int errorno, const char* syscall); diff --git a/src/unix/loop.c b/src/unix/loop.c new file mode 100644 index 00000000..29927603 --- /dev/null +++ b/src/unix/loop.c @@ -0,0 +1,49 @@ +/* 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. + */ + +#include "uv.h" +#include "tree.h" +#include "internal.h" +#include +#include + + +int uv__loop_init(uv_loop_t* loop, int default_loop) { +#if HAVE_KQUEUE + int flags = EVBACKEND_KQUEUE; +#else + int flags = EVFLAG_AUTO; +#endif + RB_INIT(&loop->uv_ares_handles_); + loop->endgame_handles = NULL; + loop->ev = (default_loop ? ev_default_loop : ev_loop_new)(flags); + ev_set_userdata(loop->ev, loop); + eio_channel_init(&loop->uv_eio_channel, loop); + uv__loop_platform_init(loop); + return 0; +} + + +void uv__loop_delete(uv_loop_t* loop) { + uv_ares_destroy(loop, loop->channel); + ev_loop_destroy(loop->ev); + uv__loop_platform_delete(loop); +} diff --git a/uv.gyp b/uv.gyp index cc5f1beb..d03ea568 100644 --- a/uv.gyp +++ b/uv.gyp @@ -196,6 +196,7 @@ 'src/unix/fs.c', 'src/unix/idle.c', 'src/unix/internal.h', + 'src/unix/loop.c', 'src/unix/pipe.c', 'src/unix/prepare.c', 'src/unix/process.c',