loop.c
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node 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 
22 #include "uv.h"
23 #include "uv/tree.h"
24 #include "internal.h"
25 #include "heap-inl.h"
26 #include <stdlib.h>
27 #include <string.h>
28 #include <unistd.h>
29 
31  void* saved_data;
32  int err;
33 
34 
35  saved_data = loop->data;
36  memset(loop, 0, sizeof(*loop));
37  loop->data = saved_data;
38 
39  heap_init((struct heap*) &loop->timer_heap);
40  QUEUE_INIT(&loop->wq);
41  QUEUE_INIT(&loop->idle_handles);
42  QUEUE_INIT(&loop->async_handles);
43  QUEUE_INIT(&loop->check_handles);
44  QUEUE_INIT(&loop->prepare_handles);
45  QUEUE_INIT(&loop->handle_queue);
46 
47  loop->active_handles = 0;
48  loop->active_reqs.count = 0;
49  loop->nfds = 0;
50  loop->watchers = NULL;
51  loop->nwatchers = 0;
52  QUEUE_INIT(&loop->pending_queue);
53  QUEUE_INIT(&loop->watcher_queue);
54 
55  loop->closing_handles = NULL;
56  uv__update_time(loop);
57  loop->async_io_watcher.fd = -1;
58  loop->async_wfd = -1;
59  loop->signal_pipefd[0] = -1;
60  loop->signal_pipefd[1] = -1;
61  loop->backend_fd = -1;
62  loop->emfile_fd = -1;
63 
64  loop->timer_counter = 0;
65  loop->stop_flag = 0;
66 
68  if (err)
69  return err;
70 
72  err = uv_signal_init(loop, &loop->child_watcher);
73  if (err)
74  goto fail_signal_init;
75 
76  uv__handle_unref(&loop->child_watcher);
77  loop->child_watcher.flags |= UV_HANDLE_INTERNAL;
78  QUEUE_INIT(&loop->process_handles);
79 
80  err = uv_rwlock_init(&loop->cloexec_lock);
81  if (err)
82  goto fail_rwlock_init;
83 
84  err = uv_mutex_init(&loop->wq_mutex);
85  if (err)
86  goto fail_mutex_init;
87 
88  err = uv_async_init(loop, &loop->wq_async, uv__work_done);
89  if (err)
90  goto fail_async_init;
91 
92  uv__handle_unref(&loop->wq_async);
93  loop->wq_async.flags |= UV_HANDLE_INTERNAL;
94 
95  return 0;
96 
97 fail_async_init:
98  uv_mutex_destroy(&loop->wq_mutex);
99 
100 fail_mutex_init:
101  uv_rwlock_destroy(&loop->cloexec_lock);
102 
103 fail_rwlock_init:
105 
106 fail_signal_init:
108 
109  return err;
110 }
111 
112 
114  int err;
115  unsigned int i;
116  uv__io_t* w;
117 
118  err = uv__io_fork(loop);
119  if (err)
120  return err;
121 
123  if (err)
124  return err;
125 
127  if (err)
128  return err;
129 
130  /* Rearm all the watchers that aren't re-queued by the above. */
131  for (i = 0; i < loop->nwatchers; i++) {
132  w = loop->watchers[i];
133  if (w == NULL)
134  continue;
135 
136  if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) {
137  w->events = 0; /* Force re-registration in uv__io_poll. */
138  QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue);
139  }
140  }
141 
142  return 0;
143 }
144 
145 
150 
151  if (loop->emfile_fd != -1) {
152  uv__close(loop->emfile_fd);
153  loop->emfile_fd = -1;
154  }
155 
156  if (loop->backend_fd != -1) {
157  uv__close(loop->backend_fd);
158  loop->backend_fd = -1;
159  }
160 
161  uv_mutex_lock(&loop->wq_mutex);
162  assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!");
163  assert(!uv__has_active_reqs(loop));
164  uv_mutex_unlock(&loop->wq_mutex);
165  uv_mutex_destroy(&loop->wq_mutex);
166 
167  /*
168  * Note that all thread pool stuff is finished at this point and
169  * it is safe to just destroy rw lock
170  */
171  uv_rwlock_destroy(&loop->cloexec_lock);
172 
173 #if 0
174  assert(QUEUE_EMPTY(&loop->pending_queue));
175  assert(QUEUE_EMPTY(&loop->watcher_queue));
176  assert(loop->nfds == 0);
177 #endif
178 
179  uv__free(loop->watchers);
180  loop->watchers = NULL;
181  loop->nwatchers = 0;
182 }
183 
184 
187  return UV_ENOSYS;
188 
189  if (va_arg(ap, int) != SIGPROF)
190  return UV_EINVAL;
191 
192  loop->flags |= UV_LOOP_BLOCK_SIGPROF;
193  return 0;
194 }
async_greeter_server_with_graceful_shutdown.loop
loop
Definition: async_greeter_server_with_graceful_shutdown.py:59
uv__signal_global_once_init
void uv__signal_global_once_init(void)
Definition: unix/signal.c:111
uv__signal_loop_fork
int uv__signal_loop_fork(uv_loop_t *loop)
Definition: unix/signal.c:279
uv__loop_close
void uv__loop_close(uv_loop_t *loop)
Definition: loop.c:146
memset
return memset(p, 0, total)
uv__work_done
void uv__work_done(uv_async_t *handle)
Definition: threadpool.c:295
uv_mutex_init
UV_EXTERN int uv_mutex_init(uv_mutex_t *handle)
Definition: libuv/src/unix/thread.c:281
uv_signal_init
UV_EXTERN int uv_signal_init(uv_loop_t *loop, uv_signal_t *handle)
Definition: unix/signal.c:317
string.h
uv_mutex_destroy
UV_EXTERN void uv_mutex_destroy(uv_mutex_t *handle)
Definition: libuv/src/unix/thread.c:323
error_ref_leak.err
err
Definition: error_ref_leak.py:35
uv__handle_unref
#define uv__handle_unref(h)
Definition: uv-common.h:266
uv_loop_init
int uv_loop_init(uv_loop_t *loop)
Definition: loop.c:30
uv__io_s::watcher_queue
void * watcher_queue[2]
Definition: unix.h:97
uv__io_s::events
unsigned int events
Definition: unix.h:99
uv_rwlock_destroy
UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t *rwlock)
Definition: libuv/src/unix/thread.c:360
QUEUE_INIT
#define QUEUE_INIT(q)
Definition: queue.h:45
uv__async_stop
void uv__async_stop(uv_loop_t *loop)
Definition: unix/async.c:227
heap-inl.h
UV_HANDLE_INTERNAL
@ UV_HANDLE_INTERNAL
Definition: uv-common.h:70
uv_loop_option
uv_loop_option
Definition: uv.h:249
uv__free
void uv__free(void *ptr)
Definition: uv-common.c:81
uv__platform_loop_delete
void uv__platform_loop_delete(uv_loop_t *loop)
Definition: aix.c:94
uv_mutex_unlock
UV_EXTERN void uv_mutex_unlock(uv_mutex_t *handle)
Definition: libuv/src/unix/thread.c:349
QUEUE_EMPTY
#define QUEUE_EMPTY(q)
Definition: queue.h:39
uv__has_active_reqs
#define uv__has_active_reqs(loop)
Definition: uv-common.h:204
tree.h
uv__signal_loop_cleanup
void uv__signal_loop_cleanup(uv_loop_t *loop)
Definition: unix/signal.c:289
uv__platform_loop_init
int uv__platform_loop_init(uv_loop_t *loop)
Definition: aix.c:80
uv.h
uv_rwlock_init
UV_EXTERN int uv_rwlock_init(uv_rwlock_t *rwlock)
Definition: libuv/src/unix/thread.c:355
uv_async_init
UV_EXTERN int uv_async_init(uv_loop_t *, uv_async_t *async, uv_async_cb async_cb)
Definition: unix/async.c:44
internal.h
uv_mutex_lock
UV_EXTERN void uv_mutex_lock(uv_mutex_t *handle)
Definition: libuv/src/unix/thread.c:329
UV_LOOP_BLOCK_SIGPROF
@ UV_LOOP_BLOCK_SIGPROF
Definition: third_party/libuv/src/unix/internal.h:141
uv__async_fork
int uv__async_fork(uv_loop_t *loop)
Definition: unix/async.c:217
uv__io_s::pevents
unsigned int pevents
Definition: unix.h:98
uv_loop_fork
int uv_loop_fork(uv_loop_t *loop)
Definition: loop.c:113
UV_LOOP_BLOCK_SIGNAL
@ UV_LOOP_BLOCK_SIGNAL
Definition: uv.h:250
uv_loop_s
Definition: uv.h:1767
uv__io_fork
int uv__io_fork(uv_loop_t *loop)
Definition: aix.c:107
uv__io_s
Definition: unix.h:94
uv__loop_configure
int uv__loop_configure(uv_loop_t *loop, uv_loop_option option, va_list ap)
Definition: loop.c:185
google_benchmark.option
option
Definition: third_party/benchmark/bindings/python/google_benchmark/__init__.py:115
QUEUE_INSERT_TAIL
#define QUEUE_INSERT_TAIL(h, q)
Definition: queue.h:92
heap
Definition: heap-inl.h:40
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
uv__close
int uv__close(int fd)
Definition: unix/core.c:557


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:30