aboutsummaryrefslogtreecommitdiffhomepage
path: root/bin
diff options
context:
space:
mode:
authorGravatar Paul Colomiets <pc@gafol.net>2011-05-03 18:21:48 +0300
committerGravatar Paul Colomiets <pc@gafol.net>2011-05-03 18:21:48 +0300
commit52613952d2cf4663c38f2a6d8f317c82a11cd337 (patch)
treec991be3137429ae94d258088c3c9ffe380ea4346 /bin
parented8f45d6eb21e5a931d55235708bcc73a2191771 (diff)
Implemented asynchronous message send to avoid deadlocks
Diffstat (limited to 'bin')
-rwxr-xr-xbin/uzbl-event-manager26
1 files changed, 24 insertions, 2 deletions
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()