| Index: third_party/psutil/examples/iotop.py
 | 
| diff --git a/third_party/psutil/examples/iotop.py b/third_party/psutil/examples/iotop.py
 | 
| index 2307c75aa7ed2d20cab343b1d7dc4804da4b9fb4..222a135b331ba3f88c9e90d43a0463305d03b86c 100644
 | 
| --- a/third_party/psutil/examples/iotop.py
 | 
| +++ b/third_party/psutil/examples/iotop.py
 | 
| @@ -1,6 +1,6 @@
 | 
|  #!/usr/bin/env python
 | 
|  #
 | 
| -# $Id: iotop.py 1143 2011-10-05 19:11:59Z g.rodola $
 | 
| +# $Id: iotop.py 1213 2011-10-29 03:30:41Z g.rodola $
 | 
|  #
 | 
|  # Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
 | 
|  # Use of this source code is governed by a BSD-style license that can be
 | 
| @@ -10,18 +10,52 @@
 | 
|  A clone of iotop (http://guichaz.free.fr/iotop/) showing real time
 | 
|  disk I/O statistics.
 | 
|  
 | 
| -It works on UNIX only as curses module is not available on Windows.
 | 
| +It works on Linux only (FreeBSD and OSX are missing support for IO
 | 
| +counters).
 | 
| +It doesn't work on Windows as curses module is required.
 | 
|  
 | 
|  Author: Giampaolo Rodola' <g.rodola@gmail.com>
 | 
|  """
 | 
|  
 | 
| +import os
 | 
| +import sys
 | 
| +import psutil
 | 
| +if not hasattr(psutil.Process, 'get_io_counters') or os.name != 'posix':
 | 
| +    sys.exit('platform not supported')
 | 
|  import time
 | 
|  import curses
 | 
|  import atexit
 | 
|  
 | 
| -import psutil
 | 
| +
 | 
| +# --- curses stuff
 | 
| +def tear_down():
 | 
| +    win.keypad(0)
 | 
| +    curses.nocbreak()
 | 
| +    curses.echo()
 | 
| +    curses.endwin()
 | 
|  
 | 
|  win = curses.initscr()
 | 
| +atexit.register(tear_down)
 | 
| +curses.endwin()
 | 
| +lineno = 0
 | 
| +
 | 
| +def print_line(line, highlight=False):
 | 
| +    """A thin wrapper around curses's addstr()."""
 | 
| +    global lineno
 | 
| +    try:
 | 
| +        if highlight:
 | 
| +            line += " " * (win.getmaxyx()[1] - len(line))
 | 
| +            win.addstr(lineno, 0, line, curses.A_REVERSE)
 | 
| +        else:
 | 
| +            win.addstr(lineno, 0, line, 0)
 | 
| +    except curses.error:
 | 
| +        lineno = 0
 | 
| +        win.refresh()
 | 
| +        raise
 | 
| +    else:
 | 
| +        lineno += 1
 | 
| +# --- /curses stuff
 | 
| +
 | 
|  
 | 
|  def bytes2human(n):
 | 
|      """
 | 
| @@ -87,50 +121,41 @@ def poll(interval):
 | 
|  
 | 
|      return (processes, disks_read_per_sec, disks_write_per_sec)
 | 
|  
 | 
| -def run(win):
 | 
| +
 | 
| +def refresh_window(procs, disks_read, disks_write):
 | 
|      """Print results on screen by using curses."""
 | 
|      curses.endwin()
 | 
|      templ = "%-5s %-7s %11s %11s  %s"
 | 
| -    interval = 0
 | 
| -    while 1:
 | 
| -        procs, disks_read, disks_write = poll(interval)
 | 
| -        win.erase()
 | 
| -
 | 
| -        disks_tot = "Total DISK READ: %s | Total DISK WRITE: %s" \
 | 
| -                    % (bytes2human(disks_read), bytes2human(disks_write))
 | 
| -        win.addstr(0, 0, disks_tot)
 | 
| -
 | 
| -        header = templ % ("PID", "USER", "DISK READ", "DISK WRITE", "COMMAND")
 | 
| -        header += " " * (win.getmaxyx()[1] - len(header))
 | 
| -        win.addstr(1, 0, header, curses.A_REVERSE)
 | 
| -
 | 
| -        lineno = 2
 | 
| -        for p in procs:
 | 
| -            line = templ % (p.pid,
 | 
| -                            p._username[:7],
 | 
| -                            bytes2human(p._read_per_sec),
 | 
| -                            bytes2human(p._write_per_sec),
 | 
| -                            p._cmdline)
 | 
| -            try:
 | 
| -                win.addstr(lineno, 0, line)
 | 
| -            except curses.error:
 | 
| -                break
 | 
| -            win.refresh()
 | 
| -            lineno += 1
 | 
| -        interval = 1
 | 
| +    win.erase()
 | 
|  
 | 
| -def main():
 | 
| -    def tear_down():
 | 
| -        win.keypad(0)
 | 
| -        curses.nocbreak()
 | 
| -        curses.echo()
 | 
| -        curses.endwin()
 | 
| +    disks_tot = "Total DISK READ: %s | Total DISK WRITE: %s" \
 | 
| +                % (bytes2human(disks_read), bytes2human(disks_write))
 | 
| +    print_line(disks_tot)
 | 
|  
 | 
| -    atexit.register(tear_down)
 | 
| +    header = templ % ("PID", "USER", "DISK READ", "DISK WRITE", "COMMAND")
 | 
| +    print_line(header, highlight=True)
 | 
| +
 | 
| +    for p in procs:
 | 
| +        line = templ % (p.pid,
 | 
| +                        p._username[:7],
 | 
| +                        bytes2human(p._read_per_sec),
 | 
| +                        bytes2human(p._write_per_sec),
 | 
| +                        p._cmdline)
 | 
| +        try:
 | 
| +            print_line(line)
 | 
| +        except curses.error:
 | 
| +            break
 | 
| +    win.refresh()
 | 
| +
 | 
| +def main():
 | 
|      try:
 | 
| -        run(win)
 | 
| +        interval = 0
 | 
| +        while 1:
 | 
| +            args = poll(interval)
 | 
| +            refresh_window(*args) 
 | 
| +            interval = 1
 | 
|      except (KeyboardInterrupt, SystemExit):
 | 
| -        pass
 | 
| +        print
 | 
|  
 | 
|  if __name__ == '__main__':
 | 
|      main()
 | 
| 
 |