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 From bffc57a31e64da24356a69f588eb8d8eeede8232 Mon Sep 17 00:00:00 2001 From: Paul Colomiets Date: Tue, 3 May 2011 20:08:16 +0300 Subject: Added `setblocking(False)` to make async writes really useful --- bin/uzbl-event-manager | 1 + 1 file changed, 1 insertion(+) (limited to 'bin') diff --git a/bin/uzbl-event-manager b/bin/uzbl-event-manager index 667f1fd..000162a 100755 --- a/bin/uzbl-event-manager +++ b/bin/uzbl-event-manager @@ -633,6 +633,7 @@ class UzblEventDaemon(object): # Accept connection and create uzbl instance. child_socket = self.server_socket.accept()[0] + child_socket.setblocking(False) self.uzbls[child_socket] = Uzbl(self, child_socket) connections += 1 -- cgit v1.2.3 From c27ccf9dc2c9a2e2554596a891fe51e76ec409c3 Mon Sep 17 00:00:00 2001 From: Paul Colomiets Date: Tue, 3 May 2011 21:59:45 +0300 Subject: Added better logging and connection close detection --- bin/uzbl-event-manager | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'bin') diff --git a/bin/uzbl-event-manager b/bin/uzbl-event-manager index 000162a..be7db8e 100755 --- a/bin/uzbl-event-manager +++ b/bin/uzbl-event-manager @@ -377,17 +377,20 @@ class Uzbl(object): def do_send(self): data = ''.join(self.child_buffer) try: - bsend = self.child_socket.send(data) + bsent = 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 + self.logger.error(get_exc()) + return self.close() else: - if bsend < len(data): - self.child_buffer = [ data[bsend:] ] + if bsent == 0: + self.logger.debug('write end of connection closed') + self.close() + elif bsent < len(data): + self.child_buffer = [ data[bsent:] ] else: del self.child_buffer[:] -- cgit v1.2.3 From 2da45f9abe35c35c02c692d921bae60f8d0236af Mon Sep 17 00:00:00 2001 From: Donald Johnson Date: Thu, 26 May 2011 03:57:57 -0500 Subject: Made main() method for uzbl-event-manager Calls main() upon running the event manager. Work done was moving a gigantic block of repetetive adding for the parser into its own function `make_parser()`, moved `get_logger(...)` out of the if-main branch, and declaring a lot of variables as globals (this can be fixed later; recommended to make all globals in all caps later). This allows someone to attach a debugger or profiler to the event manager more easily, just by editing the script. --- bin/uzbl-event-manager | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'bin') diff --git a/bin/uzbl-event-manager b/bin/uzbl-event-manager index cb462c7..2ba1938 100755 --- a/bin/uzbl-event-manager +++ b/bin/uzbl-event-manager @@ -815,8 +815,7 @@ def list_action(): for plugin in sorted(names.values()): print plugin - -if __name__ == "__main__": +def make_parser(): parser = OptionParser('usage: %prog [options] {start|stop|restart|list}') add = parser.add_option @@ -862,6 +861,29 @@ if __name__ == "__main__": dest='print_events', action="store_false", default=True, help="silence the printing of events to stdout") + return parser + +def get_logger(name): + handlers = [ch, fh] + level = [max(log_level, 10),] + logger = logging.getLogger(name) + logger.setLevel(level[0]) + for handler in handlers: + logger.addHandler(handler) + + return logger + + +def main(): + global opts + global args + global logger + global ch + global fh + global log_level + + parser = make_parser() + (opts, args) = parser.parse_args() opts.server_socket = expandpath(opts.server_socket) @@ -897,16 +919,6 @@ if __name__ == "__main__": # logging.getLogger wrapper which sets the levels and adds the # file and console handlers automagically - def get_logger(name): - handlers = [ch, fh] - level = [max(log_level, 10),] - logger = logging.getLogger(name) - logger.setLevel(level[0]) - for handler in handlers: - logger.addHandler(handler) - - return logger - # Get main logger logger = get_logger(SCRIPTNAME) logger.info('logging to %r' % opts.log_file) @@ -988,4 +1000,9 @@ if __name__ == "__main__": logger.debug('process CPU time: %f' % time.clock()) + +if __name__ == "__main__": + main() + + # vi: set et ts=4: -- cgit v1.2.3 From 0dd3b8e35a50a3946be03fa1969e34dd3ecab636 Mon Sep 17 00:00:00 2001 From: Donald Johnson Date: Fri, 27 May 2011 15:04:11 -0500 Subject: Deleted unneeded `global args` declaration. --- bin/uzbl-event-manager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bin') diff --git a/bin/uzbl-event-manager b/bin/uzbl-event-manager index 2ba1938..3c64239 100755 --- a/bin/uzbl-event-manager +++ b/bin/uzbl-event-manager @@ -874,9 +874,9 @@ def get_logger(name): return logger + def main(): global opts - global args global logger global ch global fh -- cgit v1.2.3