Lines Matching refs:loop

36 int uv__platform_loop_init(uv_loop_t* loop) {
37 loop->poll_fds = NULL;
38 loop->poll_fds_used = 0;
39 loop->poll_fds_size = 0;
40 loop->poll_fds_iterating = 0;
44 void uv__platform_loop_delete(uv_loop_t* loop) {
45 uv__free(loop->poll_fds);
46 loop->poll_fds = NULL;
49 int uv__io_fork(uv_loop_t* loop) {
50 uv__platform_loop_delete(loop);
51 return uv__platform_loop_init(loop);
55 static void uv__pollfds_maybe_resize(uv_loop_t* loop) {
60 if (loop->poll_fds_used < loop->poll_fds_size)
63 n = loop->poll_fds_size ? loop->poll_fds_size * 2 : 64;
64 p = uv__reallocf(loop->poll_fds, n * sizeof(*loop->poll_fds));
68 loop->poll_fds = p;
69 for (i = loop->poll_fds_size; i < n; i++) {
70 loop->poll_fds[i].fd = -1;
71 loop->poll_fds[i].events = 0;
72 loop->poll_fds[i].revents = 0;
74 loop->poll_fds_size = n;
78 static void uv__pollfds_swap(uv_loop_t* loop, size_t l, size_t r) {
80 pfd = loop->poll_fds[l];
81 loop->poll_fds[l] = loop->poll_fds[r];
82 loop->poll_fds[r] = pfd;
86 static void uv__pollfds_add(uv_loop_t* loop, uv__io_t* w) {
91 assert(!loop->poll_fds_iterating);
92 for (i = 0; i < loop->poll_fds_used; ++i) {
93 if (loop->poll_fds[i].fd == w->fd) {
94 loop->poll_fds[i].events = w->pevents;
100 uv__pollfds_maybe_resize(loop);
101 pe = &loop->poll_fds[loop->poll_fds_used++];
107 static void uv__pollfds_del(uv_loop_t* loop, int fd) {
109 assert(!loop->poll_fds_iterating);
110 for (i = 0; i < loop->poll_fds_used;) {
111 if (loop->poll_fds[i].fd == fd) {
113 --loop->poll_fds_used;
114 uv__pollfds_swap(loop, i, loop->poll_fds_used);
115 loop->poll_fds[loop->poll_fds_used].fd = -1;
116 loop->poll_fds[loop->poll_fds_used].events = 0;
117 loop->poll_fds[loop->poll_fds_used].revents = 0;
124 /* We must only increment the loop counter when the fds do not match.
134 void uv__io_poll(uv_loop_t* loop, int timeout) {
150 if (loop->nfds == 0) {
151 assert(QUEUE_EMPTY(&loop->watcher_queue));
156 while (!QUEUE_EMPTY(&loop->watcher_queue)) {
157 q = QUEUE_HEAD(&loop->watcher_queue);
164 assert(w->fd < (int) loop->nwatchers);
166 uv__pollfds_add(loop, w);
173 if (loop->flags & UV_LOOP_BLOCK_SIGPROF) {
180 time_base = loop->time;
182 if (uv__get_internal_fields(loop)->flags & UV_METRICS_IDLE_TIME) {
192 * our caller then we need to loop around and poll() again.
196 * will return early if the loop isn't configured with UV_METRICS_IDLE_TIME.
199 uv__metrics_set_provider_entry_time(loop);
204 nfds = poll(loop->poll_fds, (nfds_t)loop->poll_fds_used, timeout);
209 /* Update loop->time unconditionally. It's tempting to skip the update when
213 SAVE_ERRNO(uv__update_time(loop));
251 loop->poll_fds_iterating = 1;
258 for (i = 0; i < loop->poll_fds_used; i++) {
259 pe = loop->poll_fds + i;
267 assert((unsigned) fd < loop->nwatchers);
269 w = loop->watchers[fd];
273 uv__platform_invalidate_fd(loop, fd);
284 if (w == &loop->signal_io_watcher) {
287 uv__metrics_update_idle_time(loop);
288 w->cb(loop, w, pe->revents);
301 uv__metrics_update_idle_time(loop);
302 loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN);
305 loop->poll_fds_iterating = 0;
308 uv__pollfds_del(loop, -1);
311 return; /* Event loop should cycle now so don't poll again. */
325 time_diff = loop->time - time_base;
336 void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) {
341 if (loop->poll_fds_iterating) {
343 for (i = 0; i < loop->poll_fds_used; i++)
344 if (loop->poll_fds[i].fd == fd) {
345 loop->poll_fds[i].fd = -1;
346 loop->poll_fds[i].events = 0;
347 loop->poll_fds[i].revents = 0;
351 uv__pollfds_del(loop, fd);
356 int uv__io_check_fd(uv_loop_t* loop, int fd) {