diff options
author | cjihrig <cjihrig@gmail.com> | 2018-07-09 22:16:25 -0400 |
---|---|---|
committer | cjihrig <cjihrig@gmail.com> | 2018-07-10 21:47:58 -0400 |
commit | 8174d0c8cae857296c45b2c448348f2c781f6ace (patch) | |
tree | ca064ff21bac35295fc7b0e052530f87e5b3931d /deps/uv/test | |
parent | 9d71619bbee7c198cb20ec4702024ac983b5db7d (diff) | |
download | android-node-v8-8174d0c8cae857296c45b2c448348f2c781f6ace.tar.gz android-node-v8-8174d0c8cae857296c45b2c448348f2c781f6ace.tar.bz2 android-node-v8-8174d0c8cae857296c45b2c448348f2c781f6ace.zip |
deps: upgrade to libuv 1.22.0
PR-URL: https://github.com/nodejs/node/pull/21731
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps/uv/test')
-rw-r--r-- | deps/uv/test/test-condvar.c | 246 | ||||
-rw-r--r-- | deps/uv/test/test-error.c | 6 | ||||
-rw-r--r-- | deps/uv/test/test-list.h | 2 | ||||
-rw-r--r-- | deps/uv/test/test-tty.c | 6 |
4 files changed, 143 insertions, 117 deletions
diff --git a/deps/uv/test/test-condvar.c b/deps/uv/test/test-condvar.c index d956efef3c..ec60f16403 100644 --- a/deps/uv/test/test-condvar.c +++ b/deps/uv/test/test-condvar.c @@ -25,221 +25,243 @@ #include <string.h> #include <errno.h> +struct worker_config; + +typedef void (*signal_func)(struct worker_config* c, int* flag); +typedef int (*wait_func)(struct worker_config* c, const int* flag); + typedef struct worker_config { + uv_sem_t sem_waiting; /* post before waiting. */ + uv_sem_t sem_signaled; /* post after signaling. */ uv_mutex_t mutex; uv_cond_t cond; - int signal_delay; - int wait_delay; int use_broadcast; - volatile int posted_1; - volatile int posted_2; - void (*signal_cond)(struct worker_config* c, volatile int* flag); - int (*wait_cond)(struct worker_config* c, const volatile int* flag); + int posted_1; + int posted_2; + signal_func signal_cond; + wait_func wait_cond; } worker_config; +void worker_config_init(worker_config* wc, + int use_broadcast, + signal_func signal_f, + wait_func wait_f) { + /* Wipe. */ + memset(wc, 0, sizeof(*wc)); + + /* Copy vars. */ + wc->signal_cond = signal_f; + wc->wait_cond = wait_f; + wc->use_broadcast = use_broadcast; + + /* Init. */ + ASSERT(0 == uv_sem_init(&wc->sem_waiting, 0)); + ASSERT(0 == uv_sem_init(&wc->sem_signaled, 0)); + ASSERT(0 == uv_cond_init(&wc->cond)); + ASSERT(0 == uv_mutex_init(&wc->mutex)); +} +void worker_config_destroy(worker_config* wc) { + uv_mutex_destroy(&wc->mutex); + uv_cond_destroy(&wc->cond); + uv_sem_destroy(&wc->sem_signaled); + uv_sem_destroy(&wc->sem_waiting); +} + +/* arg is a worker_config. + * Call signal_cond then wait_cond. + * Partner should call wait then signal. */ static void worker(void* arg) { worker_config* c = arg; c->signal_cond(c, &c->posted_1); c->wait_cond(c, &c->posted_2); } -static void noop_worker(void* arg) { - return; -} - -static void condvar_signal(worker_config* c, volatile int* flag) { - if (c->signal_delay) - uv_sleep(c->signal_delay); +/* 1. Signal a waiting waiter. + * 2. Tell waiter we finished. */ +static void condvar_signal(worker_config* c, int* flag) { + /* Wait until waiter holds mutex and is preparing to wait. */ + uv_sem_wait(&c->sem_waiting); + /* Make sure waiter has begun waiting. */ uv_mutex_lock(&c->mutex); + + /* Help waiter differentiate between spurious and legitimate wakeup. */ ASSERT(*flag == 0); *flag = 1; + if (c->use_broadcast) uv_cond_broadcast(&c->cond); else uv_cond_signal(&c->cond); + uv_mutex_unlock(&c->mutex); -} + /* Done signaling. */ + uv_sem_post(&c->sem_signaled); +} -static int condvar_wait(worker_config* c, const volatile int* flag) { +/* 1. Wait on a signal. + * 2. Ensure that the signaler finished. */ +static int condvar_wait(worker_config* c, const int* flag) { uv_mutex_lock(&c->mutex); - if (c->wait_delay) - uv_sleep(c->wait_delay); - while (*flag == 0) { + + /* Tell signal'er that I am waiting. */ + uv_sem_post(&c->sem_waiting); + + /* Wait until I get a non-spurious signal. */ + do { uv_cond_wait(&c->cond, &c->mutex); - } + } while (*flag == 0); ASSERT(*flag == 1); + uv_mutex_unlock(&c->mutex); + /* Wait for my signal'er to finish. */ + uv_sem_wait(&c->sem_signaled); + return 0; } - +/* uv_cond_wait: One thread signals, the other waits. */ TEST_IMPL(condvar_1) { - uv_thread_t thread; worker_config wc; + uv_thread_t thread; - memset(&wc, 0, sizeof(wc)); - wc.wait_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_wait; - - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); + /* Helper signal-then-wait. */ + worker_config_init(&wc, 0, condvar_signal, condvar_wait); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); + /* We wait-then-signal. */ ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1)); wc.signal_cond(&wc, &wc.posted_2); ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + worker_config_destroy(&wc); return 0; } - +/* uv_cond_wait: One thread broadcasts, the other waits. */ TEST_IMPL(condvar_2) { - uv_thread_t thread; worker_config wc; + uv_thread_t thread; - memset(&wc, 0, sizeof(wc)); - wc.signal_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_wait; - - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); + /* Helper to signal-then-wait. */ + worker_config_init(&wc, 1, condvar_signal, condvar_wait); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); + /* We wait-then-signal. */ ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1)); wc.signal_cond(&wc, &wc.posted_2); ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + worker_config_destroy(&wc); return 0; } - -static int condvar_timedwait(worker_config* c, const volatile int* flag) { +/* 1. Wait on a signal (hopefully not timeout, else we'll hang). + * 2. Ensure that the signaler finished. */ +static int condvar_timedwait(worker_config* c, const int* flag) { int r; r = 0; uv_mutex_lock(&c->mutex); - if (c->wait_delay) - uv_sleep(c->wait_delay); - while (*flag == 0) { - r = uv_cond_timedwait(&c->cond, &c->mutex, (uint64_t)(150 * 1e6)); - ASSERT(r == 0 || r == UV_ETIMEDOUT); - if (r == UV_ETIMEDOUT) - break; - } + + /* Tell signal'er that I am waiting. */ + uv_sem_post(&c->sem_waiting); + + /* Wait until I get a non-spurious signal. */ + do { + r = uv_cond_timedwait(&c->cond, &c->mutex, (uint64_t)(1 * 1e9)); /* 1 s */ + ASSERT(r == 0); /* Should not time out. */ + } while (*flag == 0); + ASSERT(*flag == 1); + uv_mutex_unlock(&c->mutex); + /* Wait for my signal'er to finish. */ + uv_sem_wait(&c->sem_signaled); return r; } -/* Test that uv_cond_timedwait will return early when cond is signaled. */ +/* uv_cond_timedwait: One thread signals, the other timedwaits. */ TEST_IMPL(condvar_3) { - uv_thread_t thread; worker_config wc; + uv_thread_t thread; - memset(&wc, 0, sizeof(wc)); - wc.signal_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_timedwait; - - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); + /* Helper to signal-then-wait. */ + worker_config_init(&wc, 0, condvar_signal, condvar_timedwait); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); - ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1)); + /* We wait-then-signal. */ + wc.wait_cond(&wc, &wc.posted_1); wc.signal_cond(&wc, &wc.posted_2); ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + worker_config_destroy(&wc); return 0; } - +/* uv_cond_timedwait: One thread broadcasts, the other waits. */ TEST_IMPL(condvar_4) { - uv_thread_t thread; worker_config wc; + uv_thread_t thread; - memset(&wc, 0, sizeof(wc)); - wc.signal_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_timedwait; - - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); + /* Helper to signal-then-wait. */ + worker_config_init(&wc, 1, condvar_signal, condvar_timedwait); ASSERT(0 == uv_thread_create(&thread, worker, &wc)); + /* We wait-then-signal. */ wc.wait_cond(&wc, &wc.posted_1); wc.signal_cond(&wc, &wc.posted_2); ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + worker_config_destroy(&wc); return 0; } - +/* uv_cond_timedwait: One thread waits, no signal. Timeout should be delivered. */ TEST_IMPL(condvar_5) { - uv_thread_t thread; worker_config wc; + int r; + /* ns */ + uint64_t before; + uint64_t after; + uint64_t elapsed; + uint64_t timeout; - memset(&wc, 0, sizeof(wc)); - wc.use_broadcast = 1; - wc.signal_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_wait; - - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); - ASSERT(0 == uv_thread_create(&thread, worker, &wc)); - - wc.wait_cond(&wc, &wc.posted_1); - wc.signal_cond(&wc, &wc.posted_2); + timeout = 100 * 1e6; /* 100 ms in ns */ - ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + /* Mostly irrelevant. We need cond and mutex initialized. */ + worker_config_init(&wc, 0, NULL, NULL); - return 0; -} + uv_mutex_lock(&wc.mutex); -/* Test that uv_cond_timedwait will time out when cond is not signaled. */ -TEST_IMPL(condvar_6) { - uv_thread_t thread; - worker_config wc; - int r; + /* We wait. + * No signaler, so this will only return if timeout is delivered. */ + before = uv_hrtime(); + r = uv_cond_timedwait(&wc.cond, &wc.mutex, timeout); + after = uv_hrtime(); - memset(&wc, 0, sizeof(wc)); - wc.signal_delay = 100; - wc.signal_cond = condvar_signal; - wc.wait_cond = condvar_timedwait; + uv_mutex_unlock(&wc.mutex); - ASSERT(0 == uv_cond_init(&wc.cond)); - ASSERT(0 == uv_mutex_init(&wc.mutex)); - ASSERT(0 == uv_thread_create(&thread, noop_worker, &wc)); - - /* This can only return having timed out, because otherwise we - * loop forever in condvar_timedwait. */ - r = wc.wait_cond(&wc, &wc.posted_1); + /* It timed out. */ ASSERT(r == UV_ETIMEDOUT); - ASSERT(0 == uv_thread_join(&thread)); - uv_mutex_destroy(&wc.mutex); - uv_cond_destroy(&wc.cond); + /* It must have taken at least timeout, modulo system timer ticks. + * But it should not take too much longer. + * cf. MSDN docs: + * https://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx */ + elapsed = after - before; + ASSERT(0.75 * timeout <= elapsed); /* 1.0 too large for Windows. */ + ASSERT(elapsed <= 1.5 * timeout); /* 1.1 too small for OSX. */ + + worker_config_destroy(&wc); return 0; } diff --git a/deps/uv/test/test-error.c b/deps/uv/test/test-error.c index a2d559a4ee..7f44f4a1bc 100644 --- a/deps/uv/test/test-error.c +++ b/deps/uv/test/test-error.c @@ -37,6 +37,8 @@ * See https://github.com/joyent/libuv/issues/210 */ TEST_IMPL(error_message) { + char buf[32]; + /* Cop out. Can't do proper checks on systems with * i18n-ized error messages... */ @@ -49,6 +51,10 @@ TEST_IMPL(error_message) { ASSERT(strcmp(uv_strerror(1337), "Unknown error") == 0); ASSERT(strcmp(uv_strerror(-1337), "Unknown error") == 0); + ASSERT(strstr(uv_strerror_r(UV_EINVAL, buf, sizeof(buf)), "Success") == NULL); + ASSERT(strstr(uv_strerror_r(1337, buf, sizeof(buf)), "1337") != NULL); + ASSERT(strstr(uv_strerror_r(-1337, buf, sizeof(buf)), "-1337") != NULL); + return 0; } diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index e59c6b6551..24ba37461e 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -42,7 +42,6 @@ TEST_DECLARE (condvar_2) TEST_DECLARE (condvar_3) TEST_DECLARE (condvar_4) TEST_DECLARE (condvar_5) -TEST_DECLARE (condvar_6) TEST_DECLARE (semaphore_1) TEST_DECLARE (semaphore_2) TEST_DECLARE (semaphore_3) @@ -459,7 +458,6 @@ TASK_LIST_START TEST_ENTRY (condvar_3) TEST_ENTRY (condvar_4) TEST_ENTRY (condvar_5) - TEST_ENTRY (condvar_6) TEST_ENTRY (semaphore_1) TEST_ENTRY (semaphore_2) TEST_ENTRY (semaphore_3) diff --git a/deps/uv/test/test-tty.c b/deps/uv/test/test-tty.c index e761822fa3..6aaeda8f59 100644 --- a/deps/uv/test/test-tty.c +++ b/deps/uv/test/test-tty.c @@ -371,12 +371,12 @@ TEST_IMPL(tty_pty) { ASSERT(0 == uv_tty_init(&loop, &slave_tty, slave_fd, 0)); ASSERT(0 == uv_tty_init(&loop, &master_tty, master_fd, 0)); /* Check if the file descriptor was reopened. If it is, - * UV_STREAM_BLOCKING (value 0x80) isn't set on flags. + * UV_HANDLE_BLOCKING_WRITES (value 0x100000) isn't set on flags. */ - ASSERT(0 == (slave_tty.flags & 0x80)); + ASSERT(0 == (slave_tty.flags & 0x100000)); /* The master_fd of a pty should never be reopened. */ - ASSERT(master_tty.flags & 0x80); + ASSERT(master_tty.flags & 0x100000); ASSERT(0 == close(slave_fd)); uv_close((uv_handle_t*) &slave_tty, NULL); ASSERT(0 == close(master_fd)); |