libuv-svace-build
131 строка · 3.5 Кб
1/* Copyright (c) 2015, Ben Noordhuis <info@bnoordhuis.nl>
2*
3* Permission to use, copy, modify, and/or distribute this software for any
4* purpose with or without fee is hereby granted, provided that the above
5* copyright notice and this permission notice appear in all copies.
6*
7* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14*/
15
16#include "uv.h"17#include "task.h"18
19#include <string.h> /* memset */20#ifndef _WIN3221#include <unistd.h> /* close */22#endif23
24struct thread_ctx {25uv_barrier_t barrier;26uv_file fd;27};28
29static void thread_main(void* arg) {30struct thread_ctx* ctx;31uv_fs_t req;32uv_buf_t bufs[1];33char buf[4096];34ssize_t n;35int uv_errno;36
37bufs[0] = uv_buf_init(buf, sizeof(buf));38
39ctx = arg;40uv_barrier_wait(&ctx->barrier);41
42uv_sleep(100); /* make sure we are forcing the writer to block a bit */43do {44uv_errno = uv_fs_read(NULL, &req, ctx->fd, bufs, 1, -1, NULL);45n = req.result;46uv_fs_req_cleanup(&req);47} while (n > 0 || (n == -1 && uv_errno == UV_EINTR));48
49ASSERT_OK(n);50}
51
52
53#ifdef _WIN3254static void write_cb(uv_write_t* req, int status) {55ASSERT_OK(status);56req->handle = NULL; /* signal completion of write_cb */57}
58#endif59
60#ifdef _WIN3261#define NWRITES (10 << 16)62#else63#define NWRITES (10 << 20)64#endif65
66
67TEST_IMPL(pipe_set_non_blocking) {68struct thread_ctx ctx;69uv_pipe_t pipe_handle;70uv_thread_t thread;71size_t nwritten;72char data[4096];73uv_buf_t buf;74uv_file fd[2];75int n;76#ifdef _WIN3277uv_write_t write_req;78#endif79
80ASSERT_OK(uv_pipe_init(uv_default_loop(), &pipe_handle, 0));81ASSERT_OK(uv_pipe(fd, 0, 0));82ASSERT_OK(uv_pipe_open(&pipe_handle, fd[1]));83ASSERT_OK(uv_stream_set_blocking((uv_stream_t*) &pipe_handle, 1));84fd[1] = -1; /* fd[1] is owned by pipe_handle now. */85
86ctx.fd = fd[0];87ASSERT_OK(uv_barrier_init(&ctx.barrier, 2));88ASSERT_OK(uv_thread_create(&thread, thread_main, &ctx));89uv_barrier_wait(&ctx.barrier);90
91buf.len = sizeof(data);92buf.base = data;93memset(data, '.', sizeof(data));94
95nwritten = 0;96while (nwritten < NWRITES) {97/* The stream is in blocking mode so uv_try_write() should always succeed98* with the exact number of bytes that we wanted written.
99*/
100n = uv_try_write((uv_stream_t*) &pipe_handle, &buf, 1);101#ifdef _WIN32102ASSERT_EQ(n, UV_EAGAIN); /* E_NOTIMPL */103ASSERT_OK(uv_write(&write_req,104(uv_stream_t*) &pipe_handle,105&buf,1061,107write_cb));108ASSERT_NOT_NULL(write_req.handle);109ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));110ASSERT_NULL(write_req.handle); /* check for signaled completion of write_cb */111n = buf.len;112#endif113ASSERT_EQ(n, sizeof(data));114nwritten += n;115}116
117uv_close((uv_handle_t*) &pipe_handle, NULL);118ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));119
120ASSERT_OK(uv_thread_join(&thread));121#ifdef _WIN32122ASSERT_OK(_close(fd[0])); /* fd[1] is closed by uv_close(). */123#else124ASSERT_OK(close(fd[0])); /* fd[1] is closed by uv_close(). */125#endif126fd[0] = -1;127uv_barrier_destroy(&ctx.barrier);128
129MAKE_VALGRIND_HAPPY(uv_default_loop());130return 0;131}
132