Support maximize_buffer on Windows

This commit is contained in:
iliavy 2024-03-28 15:19:34 +03:00 committed by Aliaksei Levin
parent efc6bd553b
commit a65e820fc8

View File

@ -789,9 +789,8 @@ const NativeFd &UdpSocketFd::get_native_fd() const {
return get_poll_info().native_fd();
}
#if TD_PORT_POSIX
static Result<uint32> maximize_buffer(int socket_fd, int optname, uint32 max_size) {
if (setsockopt(socket_fd, SOL_SOCKET, optname, &max_size, sizeof(max_size)) == 0) {
static Result<uint32> maximize_buffer(const td::NativeFd &fd, int optname, uint32 max_size) {
if (setsockopt(fd.socket(), SOL_SOCKET, optname, reinterpret_cast<const char *>(&max_size), sizeof(max_size)) == 0) {
// fast path
return max_size;
}
@ -799,8 +798,8 @@ static Result<uint32> maximize_buffer(int socket_fd, int optname, uint32 max_siz
/* Start with the default size. */
uint32 old_size = 0;
socklen_t intsize = sizeof(old_size);
if (getsockopt(socket_fd, SOL_SOCKET, optname, &old_size, &intsize)) {
return OS_ERROR("getsockopt() failed");
if (getsockopt(fd.socket(), SOL_SOCKET, optname, reinterpret_cast<char *>(&old_size), &intsize)) {
return OS_SOCKET_ERROR("getsockopt() failed");
}
#if TD_LINUX
old_size /= 2;
@ -811,7 +810,7 @@ static Result<uint32> maximize_buffer(int socket_fd, int optname, uint32 max_siz
uint32 min_size = old_size;
while (min_size <= max_size) {
uint32 avg_size = min_size + (max_size - min_size) / 2;
if (setsockopt(socket_fd, SOL_SOCKET, optname, &avg_size, sizeof(avg_size)) == 0) {
if (setsockopt(fd.socket(), SOL_SOCKET, optname, reinterpret_cast<const char *>(&avg_size), sizeof(avg_size)) == 0) {
last_good_size = avg_size;
min_size = avg_size + 1;
} else {
@ -822,20 +821,12 @@ static Result<uint32> maximize_buffer(int socket_fd, int optname, uint32 max_siz
}
Result<uint32> UdpSocketFd::maximize_snd_buffer(uint32 max_size) {
return maximize_buffer(get_native_fd().fd(), SO_SNDBUF, max_size == 0 ? DEFAULT_UDP_MAX_SND_BUFFER_SIZE : max_size);
return maximize_buffer(get_native_fd(), SO_SNDBUF, max_size == 0 ? DEFAULT_UDP_MAX_SND_BUFFER_SIZE : max_size);
}
Result<uint32> UdpSocketFd::maximize_rcv_buffer(uint32 max_size) {
return maximize_buffer(get_native_fd().fd(), SO_RCVBUF, max_size == 0 ? DEFAULT_UDP_MAX_RCV_BUFFER_SIZE : max_size);
return maximize_buffer(get_native_fd(), SO_RCVBUF, max_size == 0 ? DEFAULT_UDP_MAX_RCV_BUFFER_SIZE : max_size);
}
#else
Result<uint32> UdpSocketFd::maximize_snd_buffer(uint32 max_size) {
return 0;
}
Result<uint32> UdpSocketFd::maximize_rcv_buffer(uint32 max_size) {
return 0;
}
#endif
#if TD_PORT_POSIX
Status UdpSocketFd::send_message(const OutboundMessage &message, bool &is_sent) {