Support maximize_buffer on Windows
This commit is contained in:
parent
efc6bd553b
commit
a65e820fc8
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user