Hello, everyone.
I am trying to learn the code of `tcp_posix.cc`. There are some functions
with similar names. I am confused about the purposes/use cases of these
functions.
I write a simple grpc app, and use GRPC_TRACE=tcp and GRPC_VERBOSITY=ERROR
(only show the breakpoints I am interested in).
I try to hack the code from the client, so I only focus on write operations.
Things start from `tcp_write()`, after preparing writing buffer with:
tcp->outgoing_buffer = buf;
tcp->outgoing_byte_idx = 0;
it goes to `tcp_flush()`.
In `tcp_flush`, the writing operation is recursively invoked in a for loop.
It first pushes `tcp->outgoing_buffer` to `iov` (It may be simple pointer
copy, not memory copy). Then, the `tcp_send()` is invoked, which in fact
sends buffer using socket. Finally, `tcp_flush` function counts the
`sending_length` and `sent_length`.
*My first question is: what is the purpose of `sending_length`?*
The `sent_length` is the bytes sent by `tcp_send()` function. There is a
`trailing` variable, which is `trailing = sending_length -
static_cast<size_t>(sent_length);` and I don't know what is the purpose of
the following check in `trailing`:
while (trailing > 0) {
size_t slice_length;
outgoing_slice_idx--;
slice_length =
GRPC_SLICE_LENGTH(tcp->outgoing_buffer->slices[outgoing_slice_idx
]);
if (slice_length > trailing) {
tcp->outgoing_byte_idx = slice_length - trailing;
break;
} else {
trailing -= slice_length;
}
}
When `tcp_flush()` returns, the writing opertion is finished.
*My second question is: Who invoke `tcp_write()`?*
There is no explicit call on `tcp_write()` in `tcp_posix.cc`. And at the
end of `tcp_write()`, there is a callback:
if (!tcp_flush(tcp, &error)) {
TCP_REF(tcp, "write");
tcp->write_cb = cb;
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
gpr_log(GPR_INFO, "write: delayed");
}
notify_on_write(tcp);
} else {
if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
const char* str = grpc_error_string(error);
gpr_log(GPR_INFO, "write: %s", str);
gpr_log(GPR_ERROR, "in tcp_write(), maybe finish writing");
}
*GRPC_CLOSURE_SCHED**(cb, error);*
}
the callback `cb` is a argument of `tcp_write()`, and I was wondering who
calls `tcp_write()` and what is the callback `cb`.
There are some functions that related to writing operations, and they are
not invoked in my tracing log.
*My third question is: what are the purposes of these uninvoked functions?*
1. static void notify_on_write(grpc_tcp* tcp)
2. static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error*
error)
Thank you for your time.
Best wishes,
Xia Rui
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/grpc-io/c8a693eb-cd16-46ff-9916-86c2479e94ec%40googlegroups.com.