|
|
|
@ -46,6 +46,7 @@ |
|
|
|
|
|
|
|
|
|
#include "src/core/support/string.h" |
|
|
|
|
#include "src/core/debug/trace.h" |
|
|
|
|
#include "src/core/profiling/timers.h" |
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
#include <grpc/support/slice.h> |
|
|
|
@ -326,6 +327,7 @@ static void grpc_tcp_handle_read(void *arg /* grpc_tcp */, int success) { |
|
|
|
|
gpr_slice *final_slices; |
|
|
|
|
size_t final_nslices; |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(HANDLE_READ_BEGIN, 0); |
|
|
|
|
slice_state_init(&read_state, static_read_slices, INLINE_SLICE_BUFFER_SIZE, |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
@ -348,9 +350,11 @@ static void grpc_tcp_handle_read(void *arg /* grpc_tcp */, int success) { |
|
|
|
|
msg.msg_controllen = 0; |
|
|
|
|
msg.msg_flags = 0; |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(RECVMSG_BEGIN, 0); |
|
|
|
|
do { |
|
|
|
|
read_bytes = recvmsg(tcp->fd, &msg, 0); |
|
|
|
|
} while (read_bytes < 0 && errno == EINTR); |
|
|
|
|
GRPC_TIMER_MARK(RECVMSG_END, 0); |
|
|
|
|
|
|
|
|
|
if (read_bytes < allocated_bytes) { |
|
|
|
|
/* TODO(klempner): Consider a second read first, in hopes of getting a
|
|
|
|
@ -402,6 +406,7 @@ static void grpc_tcp_handle_read(void *arg /* grpc_tcp */, int success) { |
|
|
|
|
++iov_size; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
GRPC_TIMER_MARK(HANDLE_READ_END, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void grpc_tcp_notify_on_read(grpc_endpoint *ep, grpc_endpoint_read_cb cb, |
|
|
|
@ -433,10 +438,12 @@ static grpc_endpoint_write_status grpc_tcp_flush(grpc_tcp *tcp) { |
|
|
|
|
msg.msg_controllen = 0; |
|
|
|
|
msg.msg_flags = 0; |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(SENDMSG_BEGIN, 0); |
|
|
|
|
do { |
|
|
|
|
/* TODO(klempner): Cork if this is a partial write */ |
|
|
|
|
sent_length = sendmsg(tcp->fd, &msg, 0); |
|
|
|
|
} while (sent_length < 0 && errno == EINTR); |
|
|
|
|
GRPC_TIMER_MARK(SENDMSG_END, 0); |
|
|
|
|
|
|
|
|
|
if (sent_length < 0) { |
|
|
|
|
if (errno == EAGAIN) { |
|
|
|
@ -472,6 +479,7 @@ static void grpc_tcp_handle_write(void *arg /* grpc_tcp */, int success) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(CB_WRITE_BEGIN, 0); |
|
|
|
|
write_status = grpc_tcp_flush(tcp); |
|
|
|
|
if (write_status == GRPC_ENDPOINT_WRITE_PENDING) { |
|
|
|
|
grpc_fd_notify_on_write(tcp->em_fd, &tcp->write_closure); |
|
|
|
@ -487,6 +495,7 @@ static void grpc_tcp_handle_write(void *arg /* grpc_tcp */, int success) { |
|
|
|
|
cb(tcp->write_user_data, cb_status); |
|
|
|
|
grpc_tcp_unref(tcp); |
|
|
|
|
} |
|
|
|
|
GRPC_TIMER_MARK(CB_WRITE_END, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_endpoint_write_status grpc_tcp_write(grpc_endpoint *ep, |
|
|
|
@ -509,6 +518,7 @@ static grpc_endpoint_write_status grpc_tcp_write(grpc_endpoint *ep, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(WRITE_BEGIN, 0); |
|
|
|
|
GPR_ASSERT(tcp->write_cb == NULL); |
|
|
|
|
slice_state_init(&tcp->write_state, slices, nslices, nslices); |
|
|
|
|
|
|
|
|
@ -522,6 +532,7 @@ static grpc_endpoint_write_status grpc_tcp_write(grpc_endpoint *ep, |
|
|
|
|
grpc_fd_notify_on_write(tcp->em_fd, &tcp->write_closure); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GRPC_TIMER_MARK(WRITE_END, 0); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|