Skip to content

Commit 1958a82

Browse files
committed
protocol/display: improve response processing
Improve performance for large responses by calling `socket.recv` with an increased size: - calculate default size according to socket parameters - if we know it, take into account current response size and how much data is needed to get the complete response
1 parent e8ce50a commit 1958a82

1 file changed

Lines changed: 13 additions & 4 deletions

File tree

Xlib/protocol/display.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
# Boston, MA 02111-1307 USA
2323

2424
# Standard modules
25-
import sys
26-
import select
27-
import struct
2825
import errno
26+
import math
27+
import select
2928
import socket
29+
import struct
30+
import sys
3031

3132
# Python 2/3 compatibility.
3233
from six import PY3, byte2int, indexbytes
@@ -120,6 +121,12 @@ def __init__(self, display = None):
120121
self.request_waiting = 0
121122
self.request_wait_lock = lock.allocate_lock()
122123

124+
# Calculate optimal default buffer size for recv.
125+
buffer_size = self.socket.getsockopt(socket.SOL_SOCKET,
126+
socket.SO_RCVBUF)
127+
buffer_size = math.pow(2, math.floor(math.log(buffer_size, 2)))
128+
self.recv_buffer_size = int(buffer_size)
129+
123130
# Data used by the send-and-recieve loop
124131
self.sent_requests = []
125132
self.recv_packet_len = 0
@@ -590,7 +597,9 @@ def send_and_recv(self, flush = None, event = None, request = None, recv = None)
590597
# We're the recieving thread, parse the data
591598
if recieving:
592599
try:
593-
bytes_recv = self.socket.recv(2048)
600+
count = self.recv_packet_len - len(self.data_recv)
601+
count = max(self.recv_buffer_size, count)
602+
bytes_recv = self.socket.recv(count)
594603
except socket.error as err:
595604
self.close_internal('server: %s' % err[1])
596605
raise self.socket_error

0 commit comments

Comments
 (0)