test-signal-pending-on-close.c
Go to the documentation of this file.
1 /* Copyright libuv project contributors. All rights reserved.
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to
5 * deal in the Software without restriction, including without limitation the
6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 * sell copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 * IN THE SOFTWARE.
20 */
21 #ifndef _WIN32
22 
23 #include "uv.h"
24 #include "task.h"
25 
26 #include <string.h>
27 #include <unistd.h>
28 
29 static uv_loop_t loop;
33 static char* buf;
34 static int close_cb_called;
35 
36 
37 static void stop_loop_cb(uv_signal_t* signal, int signum) {
38  ASSERT(signum == SIGPIPE);
39  uv_stop(signal->loop);
40 }
41 
42 static void signal_cb(uv_signal_t* signal, int signum) {
43  ASSERT(0);
44 }
45 
46 static void close_cb(uv_handle_t *handle) {
48 }
49 
50 
51 static void write_cb(uv_write_t* req, int status) {
52  ASSERT(req != NULL);
53  ASSERT(status == UV_EPIPE);
54  free(buf);
57 }
58 
59 
60 TEST_IMPL(signal_pending_on_close) {
61  int pipefds[2];
63  int r;
64 
65  ASSERT(0 == uv_loop_init(&loop));
66 
68 
69  ASSERT(0 == uv_signal_start(&signal_hdl, signal_cb, SIGPIPE));
70 
71  ASSERT(0 == pipe(pipefds));
72 
73  ASSERT(0 == uv_pipe_init(&loop, &pipe_hdl, 0));
74 
75  ASSERT(0 == uv_pipe_open(&pipe_hdl, pipefds[1]));
76 
77  /* Write data large enough so it needs loop iteration */
78  buf = malloc(1<<24);
79  ASSERT(buf != NULL);
80  memset(buf, '.', 1<<24);
81  buffer = uv_buf_init(buf, 1<<24);
82 
84  ASSERT(0 == r);
85 
86  /* cause a SIGPIPE on write in next iteration */
87  close(pipefds[0]);
88 
90 
91  ASSERT(0 == uv_loop_close(&loop));
92 
93  ASSERT(2 == close_cb_called);
94 
96  return 0;
97 }
98 
99 
100 TEST_IMPL(signal_close_loop_alive) {
101  ASSERT(0 == uv_loop_init(&loop));
103  ASSERT(0 == uv_signal_start(&signal_hdl, stop_loop_cb, SIGPIPE));
105 
106  ASSERT(0 == uv_kill(uv_os_getpid(), SIGPIPE));
107  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
109  ASSERT(1 == uv_loop_alive(&loop));
110 
111  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
112  ASSERT(0 == uv_loop_close(&loop));
113  ASSERT(1 == close_cb_called);
114 
116  return 0;
117 }
118 
119 #endif
task.h
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
signal_hdl
static uv_signal_t signal_hdl
Definition: test-signal-pending-on-close.c:30
uv_kill
UV_EXTERN int uv_kill(int pid, int signum)
Definition: unix/process.c:582
uv_os_getpid
UV_EXTERN uv_pid_t uv_os_getpid(void)
Definition: unix/core.c:1392
uv_signal_init
UV_EXTERN int uv_signal_init(uv_loop_t *loop, uv_signal_t *handle)
Definition: unix/signal.c:317
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
ASSERT
#define ASSERT(expr)
Definition: task.h:102
status
absl::Status status
Definition: rls.cc:251
write_req
Definition: benchmark-tcp-write-batch.c:31
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: unix/core.c:361
uv_unref
UV_EXTERN void uv_unref(uv_handle_t *)
Definition: uv-common.c:522
write_cb
static void write_cb(uv_write_t *req, int status)
Definition: test-signal-pending-on-close.c:51
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_loop_close
UV_EXTERN int uv_loop_close(uv_loop_t *loop)
Definition: uv-common.c:761
signal
static void signal(notification *n)
Definition: alts_tsi_handshaker_test.cc:107
uv_write
UV_EXTERN int uv_write(uv_write_t *req, uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb)
Definition: unix/stream.c:1492
req
static uv_connect_t req
Definition: test-connection-fail.c:30
TEST_IMPL
TEST_IMPL(signal_pending_on_close)
Definition: test-signal-pending-on-close.c:60
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition: uv.h:254
write_req
static uv_write_t write_req
Definition: test-signal-pending-on-close.c:32
loop
static uv_loop_t loop
Definition: test-signal-pending-on-close.c:29
signal_cb
static void signal_cb(uv_signal_t *signal, int signum)
Definition: test-signal-pending-on-close.c:42
pipe_hdl
static uv_pipe_t pipe_hdl
Definition: test-signal-pending-on-close.c:31
close
#define close
Definition: test-fs.c:48
close_cb
static void close_cb(uv_handle_t *handle)
Definition: test-signal-pending-on-close.c:46
uv_loop_init
UV_EXTERN int uv_loop_init(uv_loop_t *loop)
Definition: loop.c:30
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
uv_loop_alive
UV_EXTERN int uv_loop_alive(const uv_loop_t *loop)
Definition: unix/core.c:356
buf
static char * buf
Definition: test-signal-pending-on-close.c:33
uv.h
MAKE_VALGRIND_HAPPY
#define MAKE_VALGRIND_HAPPY()
Definition: task.h:229
uv_signal_s
Definition: uv.h:1561
uv_buf_t
Definition: unix.h:121
close_cb_called
static int close_cb_called
Definition: test-signal-pending-on-close.c:34
fix_build_deps.r
r
Definition: fix_build_deps.py:491
uv_pipe_s
Definition: uv.h:757
uv_buf_init
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
Definition: uv-common.c:157
uv_stop
UV_EXTERN void uv_stop(uv_loop_t *)
Definition: uv-common.c:532
uv_write_s
Definition: uv.h:522
handle
static csh handle
Definition: test_arm_regression.c:16
uv_handle_s
Definition: uv.h:441
uv_loop_s
Definition: uv.h:1767
uv_pipe_open
UV_EXTERN int uv_pipe_open(uv_pipe_t *, uv_file file)
Definition: unix/pipe.c:137
stop_loop_cb
static void stop_loop_cb(uv_signal_t *signal, int signum)
Definition: test-signal-pending-on-close.c:37
uv_signal_start
UV_EXTERN int uv_signal_start(uv_signal_t *handle, uv_signal_cb signal_cb, int signum)
Definition: unix/signal.c:338


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