From 22c2b19b2bfdb6deb9ac8b117c7b563a24748cd4 Mon Sep 17 00:00:00 2001 From: lxnay Date: Sat, 31 Jan 2009 14:13:01 +0000 Subject: [PATCH] Entropy/Spritz: - implement TaskQueue like I did on the repo manager, this improves multithreading reliablity git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2971 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- spritz/src/repo-manager-client.py | 2 - spritz/src/spritz.py | 166 +++++++++++++++++++----------- 2 files changed, 106 insertions(+), 62 deletions(-) diff --git a/spritz/src/repo-manager-client.py b/spritz/src/repo-manager-client.py index 5de4c108b..506ab1466 100644 --- a/spritz/src/repo-manager-client.py +++ b/spritz/src/repo-manager-client.py @@ -44,7 +44,6 @@ from etpgui import * from spritz_setup import SpritzConf, const, fakeoutfile, fakeinfile, cleanMarkupString from misc import SpritzQueue from dialogs import * -from spritz import SpritzProgress class MyRepositoryManager(RepositoryManagerMenu): @@ -65,7 +64,6 @@ class ManagerApplication: self.progressLogWrite = sys.stdout self.output = sys.stdout self.Equo = EquoConnection - #self.progress = SpritzProgress(self.ui, self.dummy_func, self) self.progress = None self.Equo.connect_to_gui(self) mymenu = MyRepositoryManager(self.Equo, None) diff --git a/spritz/src/spritz.py b/spritz/src/spritz.py index 920a55f2f..928e95ef8 100644 --- a/spritz/src/spritz.py +++ b/spritz/src/spritz.py @@ -148,68 +148,103 @@ class SpritzProgress: self.ui.progressBar.set_fraction( 0 ) self.ui.progressBar.set_text( " " ) self.lastFrac = -1 + self.do_upd_async = False + if hasattr(self.parent,'TaskQueue'): + if isinstance(self.parent.TaskQueue,list): + self.do_upd_async = True def show( self ): - self.ui.progressBox.show() - self.set_page_func( 'output' ) - self.lastFrac = -1 + def run(): + self.ui.progressBox.show() + self.set_page_func( 'output' ) + self.lastFrac = -1 + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[],{},)) + return run() def reset_progress( self ): - self.lastFrac = -1 - self.ui.progressBar.set_fraction( 0 ) - self.ui.progressBar.set_text(" ") + def run(): + self.lastFrac = -1 + self.ui.progressBar.set_fraction( 0 ) + self.ui.progressBar.set_text(" ") + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[],{},)) + return run() def hide( self, clean=False ): - self.ui.progressBox.hide() - if clean: - self.ui.progressMainLabel.set_text( "" ) - self.ui.progressSubLabel.set_text( "" ) - self.ui.progressExtraLabel.set_text( "" ) - self.ui.progressBar.set_fraction( 0 ) - self.ui.progressBar.set_text( " " ) + def run(): + self.ui.progressBox.hide() + if clean: + self.ui.progressMainLabel.set_text( "" ) + self.ui.progressSubLabel.set_text( "" ) + self.ui.progressExtraLabel.set_text( "" ) + self.ui.progressBar.set_fraction( 0 ) + self.ui.progressBar.set_text( " " ) + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[],{},)) + return run() def setTotal( self, now, total ): - self.total.setProgress( now, total ) + def run(now, total): + self.total.setProgress( now, total ) + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[now, total],{},)) + return run(now, total) def set_progress( self, frac, text=None ): + def run(frac, text): + if frac == self.lastFrac: return + if frac > 1 or frac == 0.0: return + if frac >= 0 and frac <= 1: + self.ui.progressBar.set_fraction( frac ) + else: + self.ui.progressBar.set_fraction( 0 ) + if text != None: + self.ui.progressBar.set_text( text ) + self.lastFrac = frac + self.gtkLoop() - if frac == self.lastFrac: - return - - if frac > 1 or frac == 0.0: - return - - if frac >= 0 and frac <= 1: - self.ui.progressBar.set_fraction( frac ) - else: - self.ui.progressBar.set_fraction( 0 ) - if text != None: - self.ui.progressBar.set_text( text ) - - self.lastFrac = frac - self.gtkLoop() + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[frac, text],{},)) + return run(frac, text) def set_text(self, text): - self.ui.progressBar.set_text( text ) + def run(text): + self.ui.progressBar.set_text( text ) + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[text],{},)) + return run(text) def set_mainLabel( self, text ): - self.ui.progressMainLabel.set_markup( "%s" % (text,) ) - self.ui.progressSubLabel.set_text( "" ) - self.ui.progressExtraLabel.set_text( "" ) + def run(text): + self.ui.progressMainLabel.set_markup( "%s" % (text,) ) + self.ui.progressSubLabel.set_text( "" ) + self.ui.progressExtraLabel.set_text( "" ) + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[text],{},)) + return run(text) def set_subLabel( self, text ): - mytxt = unicode(text) - if len(mytxt) > 80: - mytxt = mytxt[:80].strip()+"..." - self.ui.progressSubLabel.set_markup( "%s" % (cleanMarkupString(mytxt),) ) - self.ui.progressExtraLabel.set_text( "" ) + def run(text): + mytxt = unicode(text) + if len(mytxt) > 80: + mytxt = mytxt[:80].strip()+"..." + self.ui.progressSubLabel.set_markup( "%s" % (cleanMarkupString(mytxt),) ) + self.ui.progressExtraLabel.set_text( "" ) + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[text],{},)) + return run(text) def set_extraLabel( self, text ): - mytxt = unicode(text) - if len(mytxt) > 80: - mytxt = mytxt[:80].strip()+"..." - self.ui.progressExtraLabel.set_markup( "%s" % cleanMarkupString(mytxt) ) - self.lastFrac = -1 + def run(text): + mytxt = unicode(text) + if len(mytxt) > 80: + mytxt = mytxt[:80].strip()+"..." + self.ui.progressExtraLabel.set_markup( "%s" % cleanMarkupString(mytxt) ) + self.lastFrac = -1 + if self.do_upd_async: + return self.parent.TaskQueue.append((run,[text],{},)) + return run(text) def gtkLoop(self): while gtk.events_pending(): @@ -219,8 +254,12 @@ class SpritzApplication(Controller): def __init__(self): - self.do_debug = False self.Equo = EquoConnection + self.TaskQueueAlive = True + self.TaskQueue = [] + self.TaskQueueId = gobject.timeout_add(100, self.task_queue_executor) + + self.do_debug = False locked = self.Equo._resources_run_check_lock() if locked: okDialog( None, _("Entropy resources are locked and not accessible. Another Entropy application is running. Sorry, can't load Spritz.") ) @@ -246,25 +285,34 @@ class SpritzApplication(Controller): self.setupGUI() self.packagesInstall() - def quit(self, widget=None, event=None ): + def quit(self, widget = None, event = None, sysexit = True ): + self.TaskQueueAlive = False if self.ugcTask != None: self.ugcTask.kill() ''' Main destroy Handler ''' + self.Equo.destroy() - #gtkEventThread.doQuit() - self.exitNow() - raise SystemExit(0) + if sysexit: + self.exitNow() + raise SystemExit(0) def exitNow(self): - try: - gtk.main_quit() - except RuntimeError: - pass + try: gtk.main_quit() + except RuntimeError: pass def gtkLoop(self): while gtk.events_pending(): gtk.main_iteration() + def task_queue_executor(self): + try: + data = self.TaskQueue.pop(0) + except IndexError: + return self.TaskQueueAlive + func, args, kwargs = data + func(*args,**kwargs) + return self.TaskQueueAlive + def load_url(self, url): import subprocess subprocess.call(['xdg-open',url]) @@ -1454,7 +1502,7 @@ class SpritzApplication(Controller): self.endWorking() self.progress.reset_progress() if self.do_debug: - print "processPackageQueue: endWorked" + print "processPackageQueue: endWorking" if (not fetch_only) and (not download_sources): @@ -2689,18 +2737,16 @@ if __name__ == "__main__": gtk.gdk.threads_enter() gtk.main() gtk.gdk.threads_leave() - EquoConnection.destroy() + mainApp.quit() except SystemExit: - print "Quit by User" - EquoConnection.destroy() - raise SystemExit(0) + print "Quit by User (SystemExit)" + mainApp.quit() except KeyboardInterrupt: print "Quit by User (KeyboardInterrupt)" - EquoConnection.destroy() - raise SystemExit(0) + mainApp.quit() except: # catch other exception and write it to the logger. entropyTools.kill_threads() - EquoConnection.destroy() + mainApp.quit(sysexit = False) my = ExceptionDialog() my.show()