From 32747c75cea25a2f4c59ae25e7a1285f810ae001 Mon Sep 17 00:00:00 2001 From: Andrius Bentkus Date: Tue, 20 Jan 2015 11:00:00 +0100 Subject: [PATCH] win,unix: move loop functions which have identical implementations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uv_default_loop, uv_loop_new, uv_loop_close, uv_loop_delete PR-URL: https://github.com/libuv/libuv/pull/144 Reviewed-By: Ben Noordhuis Reviewed-by: Saúl Ibarra Corretgé --- src/unix/aix.c | 2 +- src/unix/darwin.c | 2 +- src/unix/freebsd.c | 2 +- src/unix/internal.h | 2 +- src/unix/linux-core.c | 2 +- src/unix/loop.c | 75 ++----------------------------------------- src/unix/netbsd.c | 2 +- src/unix/openbsd.c | 2 +- src/unix/sunos.c | 2 +- src/uv-common.c | 70 ++++++++++++++++++++++++++++++++++++++++ src/uv-common.h | 2 ++ src/win/core.c | 65 +------------------------------------ 12 files changed, 83 insertions(+), 145 deletions(-) diff --git a/src/unix/aix.c b/src/unix/aix.c index 0c5d1f4b..ec800c7a 100644 --- a/src/unix/aix.c +++ b/src/unix/aix.c @@ -61,7 +61,7 @@ #define RDWR_BUF_SIZE 4096 #define EQ(a,b) (strcmp(a,b) == 0) -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { loop->fs_fd = -1; /* Passing maxfd of -1 should mean the limit is determined diff --git a/src/unix/darwin.c b/src/unix/darwin.c index 651545f8..d276adac 100644 --- a/src/unix/darwin.c +++ b/src/unix/darwin.c @@ -37,7 +37,7 @@ #include /* sysconf */ -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { loop->cf_state = NULL; if (uv__kqueue_init(loop)) diff --git a/src/unix/freebsd.c b/src/unix/freebsd.c index d87b74b9..2dbb1ec1 100644 --- a/src/unix/freebsd.c +++ b/src/unix/freebsd.c @@ -58,7 +58,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/src/unix/internal.h b/src/unix/internal.h index 03a92261..101dc745 100644 --- a/src/unix/internal.h +++ b/src/unix/internal.h @@ -221,7 +221,7 @@ void uv__signal_loop_cleanup(uv_loop_t* loop); /* platform specific */ uint64_t uv__hrtime(uv_clocktype_t type); int uv__kqueue_init(uv_loop_t* loop); -int uv__platform_loop_init(uv_loop_t* loop, int default_loop); +int uv__platform_loop_init(uv_loop_t* loop); void uv__platform_loop_delete(uv_loop_t* loop); void uv__platform_invalidate_fd(uv_loop_t* loop, int fd); diff --git a/src/unix/linux-core.c b/src/unix/linux-core.c index d77b13fd..ce0d4688 100644 --- a/src/unix/linux-core.c +++ b/src/unix/linux-core.c @@ -74,7 +74,7 @@ static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); static unsigned long read_cpufreq(unsigned int cpunum); -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { int fd; fd = uv__epoll_create1(UV__EPOLL_CLOEXEC); diff --git a/src/unix/loop.c b/src/unix/loop.c index 616cf5bc..7e167d04 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -27,78 +27,7 @@ #include #include -static int uv__loop_init(uv_loop_t* loop, int default_loop); -static void uv__loop_close(uv_loop_t* loop); - -static uv_loop_t default_loop_struct; -static uv_loop_t* default_loop_ptr; - - -uv_loop_t* uv_default_loop(void) { - if (default_loop_ptr != NULL) - return default_loop_ptr; - - if (uv__loop_init(&default_loop_struct, /* default_loop? */ 1)) - return NULL; - - default_loop_ptr = &default_loop_struct; - return default_loop_ptr; -} - - int uv_loop_init(uv_loop_t* loop) { - return uv__loop_init(loop, /* default_loop? */ 0); -} - - -int uv_loop_close(uv_loop_t* loop) { - QUEUE* q; - uv_handle_t* h; - if (!QUEUE_EMPTY(&(loop)->active_reqs)) - return -EBUSY; - QUEUE_FOREACH(q, &loop->handle_queue) { - h = QUEUE_DATA(q, uv_handle_t, handle_queue); - if (!(h->flags & UV__HANDLE_INTERNAL)) - return -EBUSY; - } - uv__loop_close(loop); -#ifndef NDEBUG - memset(loop, -1, sizeof(*loop)); -#endif - if (loop == default_loop_ptr) - default_loop_ptr = NULL; - return 0; -} - - -uv_loop_t* uv_loop_new(void) { - uv_loop_t* loop; - - loop = malloc(sizeof(*loop)); - if (loop == NULL) - return NULL; - - if (uv_loop_init(loop)) { - free(loop); - return NULL; - } - - return loop; -} - - -void uv_loop_delete(uv_loop_t* loop) { - uv_loop_t* default_loop; - int err; - default_loop = default_loop_ptr; - err = uv_loop_close(loop); - assert(err == 0); - if (loop != default_loop) - free(loop); -} - - -static int uv__loop_init(uv_loop_t* loop, int default_loop) { int err; uv__signal_global_once_init(); @@ -130,7 +59,7 @@ static int uv__loop_init(uv_loop_t* loop, int default_loop) { loop->timer_counter = 0; loop->stop_flag = 0; - err = uv__platform_loop_init(loop, default_loop); + err = uv__platform_loop_init(loop); if (err) return err; @@ -155,7 +84,7 @@ static int uv__loop_init(uv_loop_t* loop, int default_loop) { } -static void uv__loop_close(uv_loop_t* loop) { +void uv__loop_close(uv_loop_t* loop) { uv__signal_loop_cleanup(loop); uv__platform_loop_delete(loop); uv__async_stop(loop, &loop->async_watcher); diff --git a/src/unix/netbsd.c b/src/unix/netbsd.c index de99d135..9eb0679d 100644 --- a/src/unix/netbsd.c +++ b/src/unix/netbsd.c @@ -49,7 +49,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/src/unix/openbsd.c b/src/unix/openbsd.c index 3e7ae848..859bc0cc 100644 --- a/src/unix/openbsd.c +++ b/src/unix/openbsd.c @@ -47,7 +47,7 @@ static char *process_title; -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { return uv__kqueue_init(loop); } diff --git a/src/unix/sunos.c b/src/unix/sunos.c index ca183a62..c41d0f0e 100644 --- a/src/unix/sunos.c +++ b/src/unix/sunos.c @@ -62,7 +62,7 @@ #endif -int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { +int uv__platform_loop_init(uv_loop_t* loop) { int err; int fd; diff --git a/src/uv-common.c b/src/uv-common.c index f84f8c4a..2bb09abf 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -456,3 +456,73 @@ int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) { return err; } + + +static uv_loop_t default_loop_struct; +static uv_loop_t* default_loop_ptr; + + +uv_loop_t* uv_default_loop(void) { + if (default_loop_ptr != NULL) + return default_loop_ptr; + + if (uv_loop_init(&default_loop_struct)) + return NULL; + + default_loop_ptr = &default_loop_struct; + return default_loop_ptr; +} + + +uv_loop_t* uv_loop_new(void) { + uv_loop_t* loop; + + loop = malloc(sizeof(*loop)); + if (loop == NULL) + return NULL; + + if (uv_loop_init(loop)) { + free(loop); + return NULL; + } + + return loop; +} + + +int uv_loop_close(uv_loop_t* loop) { + QUEUE* q; + uv_handle_t* h; + + if (!QUEUE_EMPTY(&(loop)->active_reqs)) + return UV_EBUSY; + + QUEUE_FOREACH(q, &loop->handle_queue) { + h = QUEUE_DATA(q, uv_handle_t, handle_queue); + if (!(h->flags & UV__HANDLE_INTERNAL)) + return UV_EBUSY; + } + + uv__loop_close(loop); + +#ifndef NDEBUG + memset(loop, -1, sizeof(*loop)); +#endif + if (loop == default_loop_ptr) + default_loop_ptr = NULL; + + return 0; +} + + +void uv_loop_delete(uv_loop_t* loop) { + uv_loop_t* default_loop; + int err; + + default_loop = default_loop_ptr; + + err = uv_loop_close(loop); + assert(err == 0); + if (loop != default_loop) + free(loop); +} diff --git a/src/uv-common.h b/src/uv-common.h index 11e7fc39..463cabac 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -65,6 +65,8 @@ enum { int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap); +void uv__loop_close(uv_loop_t* loop); + int uv__tcp_bind(uv_tcp_t* tcp, const struct sockaddr* addr, unsigned int addrlen, diff --git a/src/win/core.c b/src/win/core.c index 2bef8b7f..a1011594 100644 --- a/src/win/core.c +++ b/src/win/core.c @@ -184,19 +184,7 @@ void uv__once_init(void) { } -uv_loop_t* uv_default_loop(void) { - if (default_loop_ptr != NULL) - return default_loop_ptr; - - if (uv_loop_init(&default_loop_struct)) - return NULL; - - default_loop_ptr = &default_loop_struct; - return default_loop_ptr; -} - - -static void uv__loop_close(uv_loop_t* loop) { +void uv__loop_close(uv_loop_t* loop) { size_t i; /* close the async handle without needing an extra loop iteration */ @@ -221,57 +209,6 @@ static void uv__loop_close(uv_loop_t* loop) { } -int uv_loop_close(uv_loop_t* loop) { - QUEUE* q; - uv_handle_t* h; - if (!QUEUE_EMPTY(&(loop)->active_reqs)) - return UV_EBUSY; - QUEUE_FOREACH(q, &loop->handle_queue) { - h = QUEUE_DATA(q, uv_handle_t, handle_queue); - if (!(h->flags & UV__HANDLE_INTERNAL)) - return UV_EBUSY; - } - - uv__loop_close(loop); - -#ifndef NDEBUG - memset(loop, -1, sizeof(*loop)); -#endif - if (loop == default_loop_ptr) - default_loop_ptr = NULL; - - return 0; -} - - -uv_loop_t* uv_loop_new(void) { - uv_loop_t* loop; - - loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); - if (loop == NULL) { - return NULL; - } - - if (uv_loop_init(loop)) { - free(loop); - return NULL; - } - - return loop; -} - - -void uv_loop_delete(uv_loop_t* loop) { - uv_loop_t* default_loop; - int err; - default_loop = default_loop_ptr; - err = uv_loop_close(loop); - assert(err == 0); - if (loop != default_loop) - free(loop); -} - - int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { return UV_ENOSYS; }