From 52613952d2cf4663c38f2a6d8f317c82a11cd337 Mon Sep 17 00:00:00 2001 From: Paul Colomiets Date: Tue, 3 May 2011 18:21:48 +0300 Subject: Implemented asynchronous message send to avoid deadlocks --- bin/uzbl-event-manager | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'bin') diff --git a/bin/uzbl-event-manager b/bin/uzbl-event-manager index cb462c7..667f1fd 100755 --- a/bin/uzbl-event-manager +++ b/bin/uzbl-event-manager @@ -315,6 +315,7 @@ class Uzbl(object): self.opts = opts self.parent = parent self.child_socket = child_socket + self.child_buffer = [] self.time = time.time() self.pid = None self.name = None @@ -371,7 +372,24 @@ class Uzbl(object): if opts.print_events: print ascii(u'%s<-- %s' % (' ' * self._depth, msg)) - self.child_socket.send(ascii("%s\n" % msg)) + self.child_buffer.append(ascii("%s\n" % msg)) + + def do_send(self): + data = ''.join(self.child_buffer) + try: + bsend = self.child_socket.send(data) + except socket.error as e: + if e.errno in (errno.EAGAIN, errno.EINTR): + self.child_buffer = [data] + return + else: + self.close() + return + else: + if bsend < len(data): + self.child_buffer = [ data[bsend:] ] + else: + del self.child_buffer[:] def read(self): @@ -607,7 +625,8 @@ class UzblEventDaemon(object): while (self.uzbls or not connections) or (not opts.auto_close): socks = [self.server_socket] + self.uzbls.keys() - reads, _, errors = select(socks, [], socks, 1) + wsocks = [k for k, v in self.uzbls.items() if v.child_buffer] + reads, writes, errors = select(socks, wsocks, socks, 1) if self.server_socket in reads: reads.remove(self.server_socket) @@ -617,6 +636,9 @@ class UzblEventDaemon(object): self.uzbls[child_socket] = Uzbl(self, child_socket) connections += 1 + for uzbl in [self.uzbls[s] for s in writes]: + uzbl.do_send() + for uzbl in [self.uzbls[s] for s in reads]: uzbl.read() -- cgit v1.2.3