Hi!

The attached patch adds profiling to yummain.py. It's not that beautiful as it replaces all kind of system.exit() calls by returns. I don't like all these exit calls. But if anyone really likes them we can just catch the SystemExit exceptions...

I'd also like to add command line switch to enable profiling. May be --profile=(main|main-hot|depsolve|depsolve-hot|...)

Comments?

Florian
>From 60b388ac8d47ae69bc7d60b23354272e8d70b4d1 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Thu, 13 Dec 2007 13:49:10 +0100
Subject: [PATCH] Support profiling for yum as a whole

---
 yummain.py |  110 ++++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 67 insertions(+), 43 deletions(-)

diff --git a/yummain.py b/yummain.py
index 6b9663a..e3eb396 100755
--- a/yummain.py
+++ b/yummain.py
@@ -34,14 +34,14 @@ def main(args):
 
     def exUserCancel():
         logger.critical('\n\nExiting on user cancel')
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exIOError(e):
         if e.errno == 32:
             logger.critical('\n\nExiting on Broken Pipe')
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exPluginExit(e):
         '''Called when a plugin raises PluginYumExit.
@@ -51,20 +51,21 @@ def main(args):
         exitmsg = str(e)
         if exitmsg:
             logger.warn('\n\n%s', exitmsg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exFatal(e):
         logger.critical('\n\n%s', str(e))
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def unlock():
         try:
             base.closeRpmDB()
             base.doUnlock()
         except Errors.LockError, e:
-            sys.exit(200)
+            return 200
+        return 0
 
     logger = logging.getLogger("yum.main")
     verbose_logger = logging.getLogger("yum.verbose.main")
@@ -84,9 +85,9 @@ def main(args):
     try:
         base.getOptionsConfig(args)
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
-        exFatal(e)
+        return exFatal(e)
 
     lockerr = ""
     while True:
@@ -104,40 +105,40 @@ def main(args):
     try:
         result, resultmsgs = base.doCommands()
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
         result = 1
         resultmsgs = [str(e)]
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
 
     # Act on the command/shell result
     if result == 0:
         # Normal exit 
         for msg in resultmsgs:
             verbose_logger.log(logginglevels.INFO_2, '%s', msg)
-        unlock()
-        sys.exit(0)
+        if unlock(): return 200
+        return 0
     elif result == 1:
         # Fatal error
         for msg in resultmsgs:
             logger.critical('Error: %s', msg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
     elif result == 2:
         # Continue on
         pass
     elif result == 100:
-        unlock()
-        sys.exit(100)
+        if unlock(): return 200
+        return 100
     else:
         logger.critical('Unknown Error(s): Exit Code: %d:', result)
         for msg in resultmsgs:
             logger.critical(msg)
-        unlock()
-        sys.exit(3)
+        if unlock(): return 200
+        return 3
             
     # Depsolve stage
     verbose_logger.log(logginglevels.INFO_2, 'Resolving Dependencies')
@@ -145,26 +146,26 @@ def main(args):
     try:
         (result, resultmsgs) = base.buildTransaction() 
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
         result = 1
         resultmsgs = [str(e)]
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
    
     # Act on the depsolve result
     if result == 0:
         # Normal exit
-        unlock()
-        sys.exit(0)
+        if unlock(): return 200
+        return 0
     elif result == 1:
         # Fatal error
         for msg in resultmsgs:
             logger.critical('Error: %s', msg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
     elif result == 2:
         # Continue on
         pass
@@ -172,8 +173,8 @@ def main(args):
         logger.critical('Unknown Error(s): Exit Code: %d:', result)
         for msg in resultmsgs:
             logger.critical(msg)
-        unlock()
-        sys.exit(3)
+        if unlock(): return 200
+        return 3
 
     verbose_logger.log(logginglevels.INFO_2, '\nDependencies Resolved')
     verbose_logger.debug(time.time())
@@ -182,26 +183,49 @@ def main(args):
     try:
         base.doTransaction()
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
-        exFatal(e)
+        return exFatal(e)
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
 
     verbose_logger.log(logginglevels.INFO_2, 'Complete!')
-    unlock()
-    sys.exit(0)
-
+    if unlock(): return 200
+    return 0
+
+def hotshot(func, *args, **kwargs):
+    import hotshot.stats, os.path
+    fn = os.path.expanduser("~/yum.prof")
+    prof = hotshot.Profile(fn)
+    rc = prof.runcall(func, *args, **kwargs)
+    prof.close()
+    print_stats(hotshot.stats.load(fn))
+    return rc
+
+def cprof(func, *args, **kwargs):
+    import cProfile, pstats, os.path
+    fn = os.path.expanduser("~/yum.prof")
+    prof = cProfile.Profile()
+    rc = prof.runcall(func, *args, **kwargs)
+    prof.dump_stats(fn)
+    print_stats(pstats.Stats(fn))
+    return rc
+
+def print_stats(stats):
+    stats.strip_dirs()
+    stats.sort_stats('time', 'calls')
+    stats.print_stats(20)
+    stats.sort_stats('cumulative')
+    stats.print_stats(40)
 
 if __name__ == "__main__":
-    #import hotshot
-    #p = hotshot.Profile(os.path.expanduser("~/yum.prof"))
-    #p.run('main(sys.argv[1:])')
-    #p.close()    
     try:
-        main(sys.argv[1:])
+        errcode = main(sys.argv[1:])
+        #errcode = cprof(main, sys.argv[1:])
+        #errcode = hotshot(main, sys.argv[1:])
+        sys.exit(errcode)
     except KeyboardInterrupt, e:
         print >> sys.stderr, "\n\nExiting on user cancel."
         sys.exit(1)
-- 
1.5.3.3

_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to