Index: third_party/psutil/psutil/_psbsd.py |
diff --git a/third_party/psutil/psutil/_psbsd.py b/third_party/psutil/psutil/_psbsd.py |
index b437a6a500445e727e7384ac22e87abf594e9ed7..63def97a50e4e56ac8fb8cdb5d3cb0c61641b529 100644 |
--- a/third_party/psutil/psutil/_psbsd.py |
+++ b/third_party/psutil/psutil/_psbsd.py |
@@ -1,6 +1,6 @@ |
#!/usr/bin/env python |
# |
-# $Id: _psbsd.py 1142 2011-10-05 18:45:49Z g.rodola $ |
+# $Id: _psbsd.py 1206 2011-10-26 21:13:51Z 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 |
@@ -59,6 +59,23 @@ def get_system_per_cpu_times(): |
item = _cputimes_ntuple(user, nice, system, idle, irq) |
ret.append(item) |
return ret |
+ |
+# XXX |
+# Ok, this is very dirty. |
+# On FreeBSD < 8 we cannot gather per-cpu information, see: |
+# http://code.google.com/p/psutil/issues/detail?id=226 |
+# If NUM_CPUS > 1, on first call we return single cpu times to avoid a |
+# crash at psutil import time. |
+# Next calls will fail with NotImplementedError |
+if not hasattr(_psutil_bsd, "get_system_per_cpu_times"): |
+ def get_system_per_cpu_times(): |
+ if NUM_CPUS == 1: |
+ return [get_system_cpu_times] |
+ if get_system_per_cpu_times.__called__: |
+ raise NotImplementedError("supported only starting from FreeBSD 8") |
+ get_system_per_cpu_times.__called__ = True |
+ return [get_system_cpu_times] |
+get_system_per_cpu_times.__called__ = False |
def disk_partitions(all=False): |
retlist = [] |
@@ -78,7 +95,8 @@ def disk_partitions(all=False): |
get_pid_list = _psutil_bsd.get_pid_list |
pid_exists = _psposix.pid_exists |
get_disk_usage = _psposix.get_disk_usage |
-network_io_counters = _psutil_osx.get_network_io_counters |
+network_io_counters = _psutil_bsd.get_network_io_counters |
+disk_io_counters = _psutil_bsd.get_disk_io_counters |
def wrap_exceptions(method): |
@@ -145,6 +163,13 @@ class Process(object): |
"""Return process parent pid.""" |
return _psutil_bsd.get_process_ppid(self.pid) |
+ # XXX - available on FreeBSD >= 8 only |
+ if hasattr(_psutil_bsd, "get_process_cwd"): |
+ @wrap_exceptions |
+ def get_process_cwd(self): |
+ """Return process current working directory.""" |
+ return _psutil_bsd.get_process_cwd(self.pid) |
+ |
@wrap_exceptions |
def get_process_uids(self): |
"""Return real, effective and saved user ids.""" |
@@ -190,17 +215,32 @@ class Process(object): |
retlist.append(ntuple) |
return retlist |
+ @wrap_exceptions |
def get_open_files(self): |
- """Return files opened by process by parsing lsof output.""" |
- lsof = _psposix.LsofParser(self.pid, self._process_name) |
- return lsof.get_process_open_files() |
- |
- def get_connections(self): |
+ """Return files opened by process as a list of namedtuples.""" |
+ # XXX - C implementation available on FreeBSD >= 8 only |
+ # else fallback on lsof parser |
+ if hasattr(_psutil_bsd, "get_process_open_files"): |
+ rawlist = _psutil_bsd.get_process_open_files(self.pid) |
+ return [ntuple_openfile(path, fd) for path, fd in rawlist] |
+ else: |
+ lsof = _psposix.LsofParser(self.pid, self._process_name) |
+ return lsof.get_process_open_files() |
+ |
+ def get_connections(self, kind='inet'): |
"""Return network connections opened by a process as a list of |
namedtuples by parsing lsof output. |
""" |
+ if kind not in conn_tmap: |
+ raise ValueError("invalid %r kind argument; choose between %s" |
+ % (kind, ', '.join([repr(x) for x in conn_tmap]))) |
+ families, types = conn_tmap[kind] |
+ ret = [] |
lsof = _psposix.LsofParser(self.pid, self._process_name) |
- return lsof.get_process_connections() |
+ for conn in lsof.get_process_connections(): |
+ if conn.family in families and conn.type in types: |
+ ret.append(conn) |
+ return ret |
@wrap_exceptions |
def process_wait(self, timeout=None): |