1e66f31c5Sopenharmony_ci/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2e66f31c5Sopenharmony_ci *
3e66f31c5Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
4e66f31c5Sopenharmony_ci * of this software and associated documentation files (the "Software"), to
5e66f31c5Sopenharmony_ci * deal in the Software without restriction, including without limitation the
6e66f31c5Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7e66f31c5Sopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is
8e66f31c5Sopenharmony_ci * furnished to do so, subject to the following conditions:
9e66f31c5Sopenharmony_ci *
10e66f31c5Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
11e66f31c5Sopenharmony_ci * all copies or substantial portions of the Software.
12e66f31c5Sopenharmony_ci *
13e66f31c5Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14e66f31c5Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15e66f31c5Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16e66f31c5Sopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17e66f31c5Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18e66f31c5Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19e66f31c5Sopenharmony_ci * IN THE SOFTWARE.
20e66f31c5Sopenharmony_ci */
21e66f31c5Sopenharmony_ci
22e66f31c5Sopenharmony_ci#include "uv.h"
23e66f31c5Sopenharmony_ci#include "internal.h"
24e66f31c5Sopenharmony_ci
25e66f31c5Sopenharmony_ci#define UV_LOOP_WATCHER_DEFINE(name, type)                                    \
26e66f31c5Sopenharmony_ci  int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) {              \
27e66f31c5Sopenharmony_ci    uv__handle_init(loop, (uv_handle_t*)handle, UV_##type);                   \
28e66f31c5Sopenharmony_ci    handle->name##_cb = NULL;                                                 \
29e66f31c5Sopenharmony_ci    return 0;                                                                 \
30e66f31c5Sopenharmony_ci  }                                                                           \
31e66f31c5Sopenharmony_ci                                                                              \
32e66f31c5Sopenharmony_ci  int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) {           \
33e66f31c5Sopenharmony_ci    if (uv__is_active(handle)) return 0;                                      \
34e66f31c5Sopenharmony_ci    if (cb == NULL) return UV_EINVAL;                                         \
35e66f31c5Sopenharmony_ci    uv__queue_insert_head(&handle->loop->name##_handles, &handle->queue);     \
36e66f31c5Sopenharmony_ci    handle->name##_cb = cb;                                                   \
37e66f31c5Sopenharmony_ci    uv__handle_start(handle);                                                 \
38e66f31c5Sopenharmony_ci    return 0;                                                                 \
39e66f31c5Sopenharmony_ci  }                                                                           \
40e66f31c5Sopenharmony_ci                                                                              \
41e66f31c5Sopenharmony_ci  int uv_##name##_stop(uv_##name##_t* handle) {                               \
42e66f31c5Sopenharmony_ci    if (!uv__is_active(handle)) return 0;                                     \
43e66f31c5Sopenharmony_ci    uv__queue_remove(&handle->queue);                                         \
44e66f31c5Sopenharmony_ci    uv__handle_stop(handle);                                                  \
45e66f31c5Sopenharmony_ci    return 0;                                                                 \
46e66f31c5Sopenharmony_ci  }                                                                           \
47e66f31c5Sopenharmony_ci                                                                              \
48e66f31c5Sopenharmony_ci  void uv__run_##name(uv_loop_t* loop) {                                      \
49e66f31c5Sopenharmony_ci    uv_##name##_t* h;                                                         \
50e66f31c5Sopenharmony_ci    struct uv__queue queue;                                                   \
51e66f31c5Sopenharmony_ci    struct uv__queue* q;                                                      \
52e66f31c5Sopenharmony_ci    uv__queue_move(&loop->name##_handles, &queue);                            \
53e66f31c5Sopenharmony_ci    while (!uv__queue_empty(&queue)) {                                        \
54e66f31c5Sopenharmony_ci      q = uv__queue_head(&queue);                                             \
55e66f31c5Sopenharmony_ci      h = uv__queue_data(q, uv_##name##_t, queue);                            \
56e66f31c5Sopenharmony_ci      uv__queue_remove(q);                                                    \
57e66f31c5Sopenharmony_ci      uv__queue_insert_tail(&loop->name##_handles, q);                        \
58e66f31c5Sopenharmony_ci      h->name##_cb(h);                                                        \
59e66f31c5Sopenharmony_ci    }                                                                         \
60e66f31c5Sopenharmony_ci  }                                                                           \
61e66f31c5Sopenharmony_ci                                                                              \
62e66f31c5Sopenharmony_ci  void uv__##name##_close(uv_##name##_t* handle) {                            \
63e66f31c5Sopenharmony_ci    uv_##name##_stop(handle);                                                 \
64e66f31c5Sopenharmony_ci  }
65e66f31c5Sopenharmony_ci
66e66f31c5Sopenharmony_ciUV_LOOP_WATCHER_DEFINE(prepare, PREPARE)
67e66f31c5Sopenharmony_ciUV_LOOP_WATCHER_DEFINE(check, CHECK)
68e66f31c5Sopenharmony_ciUV_LOOP_WATCHER_DEFINE(idle, IDLE)
69