22
22
#include <assert.h>
25
#include "../uv-common.h"
26
25
#include "internal.h"
29
void uv_req_init(uv_loop_t* loop, uv_req_t* req) {
30
loop->counters.req_init++;
31
req->type = UV_UNKNOWN_REQ;
36
uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped) {
37
return CONTAINING_RECORD(overlapped, uv_req_t, overlapped);
41
void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) {
43
if (loop->pending_reqs_tail) {
44
req->next_req = loop->pending_reqs_tail->next_req;
45
loop->pending_reqs_tail->next_req = req;
46
loop->pending_reqs_tail = req;
49
loop->pending_reqs_tail = req;
54
#define DELEGATE_STREAM_REQ(loop, req, method, handle_at) \
56
switch (((uv_handle_t*) (req)->handle_at)->type) { \
58
uv_process_tcp_##method##_req(loop, \
59
(uv_tcp_t*) ((req)->handle_at), \
64
uv_process_pipe_##method##_req(loop, \
65
(uv_pipe_t*) ((req)->handle_at), \
70
uv_process_tty_##method##_req(loop, \
71
(uv_tty_t*) ((req)->handle_at), \
81
void uv_process_reqs(uv_loop_t* loop) {
86
if (loop->pending_reqs_tail == NULL) {
90
first = loop->pending_reqs_tail->next_req;
92
loop->pending_reqs_tail = NULL;
94
while (next != NULL) {
96
next = req->next_req != first ? req->next_req : NULL;
100
DELEGATE_STREAM_REQ(loop, req, read, data);
104
DELEGATE_STREAM_REQ(loop, (uv_write_t*) req, write, handle);
108
DELEGATE_STREAM_REQ(loop, req, accept, data);
112
DELEGATE_STREAM_REQ(loop, (uv_connect_t*) req, connect, handle);
116
/* Tcp shutdown requests don't come here. */
117
assert(((uv_shutdown_t*) req)->handle->type == UV_NAMED_PIPE);
118
uv_process_pipe_shutdown_req(
120
(uv_pipe_t*) ((uv_shutdown_t*) req)->handle,
121
(uv_shutdown_t*) req);
125
uv_process_udp_recv_req(loop, (uv_udp_t*) req->data, req);
129
uv_process_udp_send_req(loop,
130
((uv_udp_send_t*) req)->handle,
131
(uv_udp_send_t*) req);
135
uv_process_async_wakeup_req(loop, (uv_async_t*) req->data, req);
138
case UV_ARES_EVENT_REQ:
139
uv_process_ares_event_req(loop, (uv_ares_action_t*) req->data, req);
142
case UV_ARES_CLEANUP_REQ:
143
uv_process_ares_cleanup_req(loop, (uv_ares_task_t*) req->data, req);
146
case UV_GETADDRINFO_REQ:
147
uv_process_getaddrinfo_req(loop, (uv_getaddrinfo_t*) req->data, req);
150
case UV_PROCESS_EXIT:
151
uv_process_proc_exit(loop, (uv_process_t*) req->data);
154
case UV_PROCESS_CLOSE:
155
uv_process_proc_close(loop, (uv_process_t*) req->data);
159
uv_process_fs_req(loop, (uv_fs_t*) req);
163
uv_process_work_req(loop, (uv_work_t*) req);
166
case UV_FS_EVENT_REQ:
167
uv_process_fs_event_req(loop, req, (uv_fs_event_t*) req->data);