test-pipe-set-non-blocking.c
Go to the documentation of this file.
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 #ifdef _WIN32
20 
21 TEST_IMPL(pipe_set_non_blocking) {
22  RETURN_SKIP("Test not implemented on Windows.");
23 }
24 
25 #else /* !_WIN32 */
26 
27 #include <errno.h>
28 #include <string.h>
29 #include <sys/socket.h>
30 #include <sys/types.h>
31 #include <sys/un.h>
32 #include <unistd.h>
33 
34 struct thread_ctx {
36  int fd;
37 };
38 
39 static void thread_main(void* arg) {
40  struct thread_ctx* ctx;
41  char buf[4096];
42  ssize_t n;
43 
44  ctx = arg;
45  uv_barrier_wait(&ctx->barrier);
46 
47  do
48  n = read(ctx->fd, buf, sizeof(buf));
49  while (n > 0 || (n == -1 && errno == EINTR));
50 
51  ASSERT(n == 0);
52 }
53 
54 TEST_IMPL(pipe_set_non_blocking) {
55  struct thread_ctx ctx;
58  size_t nwritten;
59  char data[4096];
60  uv_buf_t buf;
61  int fd[2];
62  int n;
63 
65  ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, fd));
66  ASSERT(0 == uv_pipe_open(&pipe_handle, fd[0]));
68 
69  ctx.fd = fd[1];
70  ASSERT(0 == uv_barrier_init(&ctx.barrier, 2));
72  uv_barrier_wait(&ctx.barrier);
73 
74  buf.len = sizeof(data);
75  buf.base = data;
76  memset(data, '.', sizeof(data));
77 
78  nwritten = 0;
79  while (nwritten < 10 << 20) {
80  /* The stream is in blocking mode so uv_try_write() should always succeed
81  * with the exact number of bytes that we wanted written.
82  */
84  ASSERT(n == sizeof(data));
85  nwritten += n;
86  }
87 
88  uv_close((uv_handle_t*) &pipe_handle, NULL);
90 
92  ASSERT(0 == close(fd[1])); /* fd[0] is closed by uv_close(). */
93  uv_barrier_destroy(&ctx.barrier);
94 
96  return 0;
97 }
98 
99 #endif /* !_WIN32 */
task.h
ctx
Definition: benchmark-async.c:30
memset
return memset(p, 0, total)
uv_pipe_init
UV_EXTERN int uv_pipe_init(uv_loop_t *, uv_pipe_t *handle, int ipc)
Definition: unix/pipe.c:33
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv_barrier_destroy
UV_EXTERN void uv_barrier_destroy(uv_barrier_t *barrier)
Definition: libuv/src/unix/thread.c:118
ASSERT
#define ASSERT(expr)
Definition: task.h:102
ctx
static struct test_ctx ctx
Definition: test-ipc-send-recv.c:65
uv_thread_join
UV_EXTERN int uv_thread_join(uv_thread_t *tid)
Definition: libuv/src/unix/thread.c:271
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: unix/core.c:361
uv_close
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: unix/core.c:112
uv_stream_s
Definition: uv.h:491
uv_default_loop
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:733
ssize_t
intptr_t ssize_t
Definition: win.h:27
uv_barrier_init
UV_EXTERN int uv_barrier_init(uv_barrier_t *barrier, unsigned int count)
Definition: libuv/src/unix/thread.c:55
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition: uv.h:254
arg
Definition: cmdline.cc:40
uv_try_write
UV_EXTERN int uv_try_write(uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs)
Definition: unix/stream.c:1507
close
#define close
Definition: test-fs.c:48
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
uv_thread_create
UV_EXTERN int uv_thread_create(uv_thread_t *tid, uv_thread_cb entry, void *arg)
Definition: libuv/src/unix/thread.c:209
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
uv_stream_set_blocking
UV_EXTERN int uv_stream_set_blocking(uv_stream_t *handle, int blocking)
Definition: unix/stream.c:1688
thread_ctx
Definition: libuv/src/win/thread.c:90
uv.h
MAKE_VALGRIND_HAPPY
#define MAKE_VALGRIND_HAPPY()
Definition: task.h:229
uv_barrier_t
Definition: unix.h:154
uv_buf_t
Definition: unix.h:121
read
int read(izstream &zs, T *x, Items items)
Definition: bloaty/third_party/zlib/contrib/iostream2/zstream.h:115
TEST_IMPL
TEST_IMPL(pipe_set_non_blocking)
Definition: test-pipe-set-non-blocking.c:54
pipe_handle
static uv_pipe_t pipe_handle
Definition: test-pipe-connect-prepare.c:39
arg
struct arg arg
uv_pipe_s
Definition: uv.h:757
thread_ctx::barrier
uv_barrier_t barrier
Definition: test-eintr-handling.c:45
thread_ctx::fd
int fd
Definition: test-eintr-handling.c:46
RETURN_SKIP
#define RETURN_SKIP(explanation)
Definition: task.h:262
uv_handle_s
Definition: uv.h:441
uv_thread_t
pthread_t uv_thread_t
Definition: unix.h:134
thread_main
static void thread_main(void *arg)
Definition: test-pipe-set-non-blocking.c:39
uv_barrier_wait
UV_EXTERN int uv_barrier_wait(uv_barrier_t *barrier)
Definition: libuv/src/unix/thread.c:89
uv_pipe_open
UV_EXTERN int uv_pipe_open(uv_pipe_t *, uv_file file)
Definition: unix/pipe.c:137
thread
static uv_thread_t thread
Definition: test-async-null-cb.c:29
errno.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:26