mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use a pipe rather than a socketpair on Unix
Might fix the test failure issues, who knows On windows, we have to use a socketpair since pipes dont work with select
This commit is contained in:
parent
e5a5065934
commit
62a0bdad07
@ -15,6 +15,7 @@ from functools import partial
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from calibre import as_unicode
|
from calibre import as_unicode
|
||||||
|
from calibre.constants import iswindows
|
||||||
from calibre.ptempfile import TemporaryDirectory
|
from calibre.ptempfile import TemporaryDirectory
|
||||||
from calibre.srv.errors import JobQueueFull
|
from calibre.srv.errors import JobQueueFull
|
||||||
from calibre.srv.jobs import JobsManager
|
from calibre.srv.jobs import JobsManager
|
||||||
@ -423,7 +424,14 @@ class ServerLoop(object):
|
|||||||
return ssl.ALERT_DESCRIPTION_NO_RENEGOTIATION
|
return ssl.ALERT_DESCRIPTION_NO_RENEGOTIATION
|
||||||
|
|
||||||
def create_control_connection(self):
|
def create_control_connection(self):
|
||||||
self.control_in, self.control_out = create_sock_pair()
|
if iswindows:
|
||||||
|
self.control_in, self.control_out = create_sock_pair()
|
||||||
|
else:
|
||||||
|
r, w = os.pipe()
|
||||||
|
os.set_blocking(r, False)
|
||||||
|
os.set_blocking(w, True)
|
||||||
|
self.control_in = open(w, 'wb')
|
||||||
|
self.control_out = open(r, 'rb')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s(%r)" % (self.__class__.__name__, self.bind_address)
|
return "%s(%r)" % (self.__class__.__name__, self.bind_address)
|
||||||
@ -636,11 +644,18 @@ class ServerLoop(object):
|
|||||||
self.log.error('Error in SSL handshake, terminating connection: %s' % as_unicode(e))
|
self.log.error('Error in SSL handshake, terminating connection: %s' % as_unicode(e))
|
||||||
self.close(s, conn)
|
self.close(s, conn)
|
||||||
|
|
||||||
|
def write_to_control(self, what):
|
||||||
|
if iswindows:
|
||||||
|
self.control_in.sendall(what)
|
||||||
|
else:
|
||||||
|
self.control_in.write(what)
|
||||||
|
self.control_in.flush()
|
||||||
|
|
||||||
def wakeup(self):
|
def wakeup(self):
|
||||||
self.control_in.sendall(WAKEUP)
|
self.write_to_control(WAKEUP)
|
||||||
|
|
||||||
def job_completed(self):
|
def job_completed(self):
|
||||||
self.control_in.sendall(JOB_DONE)
|
self.write_to_control(JOB_DONE)
|
||||||
|
|
||||||
def dispatch_job_results(self):
|
def dispatch_job_results(self):
|
||||||
while True:
|
while True:
|
||||||
@ -670,9 +685,10 @@ class ServerLoop(object):
|
|||||||
if self.ssl_context is not None:
|
if self.ssl_context is not None:
|
||||||
yield s, conn, RDWR
|
yield s, conn, RDWR
|
||||||
elif s == control:
|
elif s == control:
|
||||||
|
f = self.control_out.recv if iswindows else self.control_out.read
|
||||||
try:
|
try:
|
||||||
c = self.control_out.recv(1)
|
c = f(1)
|
||||||
except socket.error:
|
except (socket.error, OSError):
|
||||||
if not self.ready:
|
if not self.ready:
|
||||||
return
|
return
|
||||||
self.log.error('Control socket raised an error, resetting')
|
self.log.error('Control socket raised an error, resetting')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user