Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: third_party/psutil/psutil/_pslinux.py

Issue 8774018: Add psutil build step to fix pyauto media issues. Upgrade psutil to 0.4.0. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Disable Mac builds. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/psutil/psutil/_pslinux.py
diff --git a/third_party/psutil/psutil/_pslinux.py b/third_party/psutil/psutil/_pslinux.py
old mode 100644
new mode 100755
index 443b6ade9d2a9744778cc30e9ac55cc2d5da6658..ffe043d617afab6adfc5f4213caea7a997df9534
--- a/third_party/psutil/psutil/_pslinux.py
+++ b/third_party/psutil/psutil/_pslinux.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# $Id: _pslinux.py 1142 2011-10-05 18:45:49Z g.rodola $
+# $Id: _pslinux.py 1173 2011-10-19 19:29:46Z 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
@@ -41,18 +41,26 @@ def _get_boot_time():
def _get_num_cpus():
"""Return the number of CPUs on the system"""
- num = 0
- f = open('/proc/cpuinfo', 'r')
+ # we try to determine num CPUs by using different approaches.
+ # SC_NPROCESSORS_ONLN seems to be the safer and it is also
+ # used by multiprocessing module
try:
- lines = f.readlines()
- finally:
- f.close()
- for line in lines:
- if line.lower().startswith('processor'):
- num += 1
+ return os.sysconf("SC_NPROCESSORS_ONLN")
+ except ValueError:
+ # as a second fallback we try to parse /proc/cpuinfo
+ num = 0
+ f = open('/proc/cpuinfo', 'r')
+ try:
+ lines = f.readlines()
+ finally:
+ f.close()
+ for line in lines:
+ if line.lower().startswith('processor'):
+ num += 1
# unknown format (e.g. amrel/sparc architectures), see:
# http://code.google.com/p/psutil/issues/detail?id=200
+ # try to parse /proc/stat as a last resort
if num == 0:
f = open('/proc/stat', 'r')
try:
@@ -115,37 +123,20 @@ def phymem_buffers():
kernel in bytes.
This reflects the "buffers" column of free command line utility.
"""
- f = open('/proc/meminfo', 'r')
- try:
- for line in f:
- if line.startswith('Buffers:'):
- return int(line.split()[1]) * 1024
- raise RuntimeError("line not found")
- finally:
- f.close()
+ total, free, buffers = _psutil_linux.get_physmem()
+ return buffers
def phymem_usage():
+ """Return physical memory usage statistics as a namedutple including
+ tota, used, free and percent usage.
+ """
# total, used and free values are matched against free cmdline utility
# the percentage matches top/htop and gnome-system-monitor
- f = open('/proc/meminfo', 'r')
- try:
- total = free = buffers = cached = None
- for line in f:
- if line.startswith('MemTotal:'):
- total = int(line.split()[1]) * 1024
- elif line.startswith('MemFree:'):
- free = int(line.split()[1]) * 1024
- elif line.startswith('Buffers:'):
- buffers = int(line.split()[1]) * 1024
- elif line.startswith('Cached:'):
- cached = int(line.split()[1]) * 1024
- break
- used = total - free
- percent = usage_percent(total - (free + buffers + cached), total,
- _round=1)
- return ntuple_sysmeminfo(total, used, free, percent)
- finally:
- f.close()
+ total, free, buffers = _psutil_linux.get_physmem()
+ cached = cached_phymem()
+ used = total - free
+ percent = usage_percent(total - (free + buffers + cached), total, _round=1)
+ return ntuple_sysmeminfo(total, used, free, percent)
def virtmem_usage():
@@ -607,7 +598,23 @@ class Process(object):
return retlist
@wrap_exceptions
- def get_connections(self):
+ def get_connections(self, kind='inet'):
+ """Return connections opened by process as a list of namedtuples.
+ The kind parameter filters for connections that fit the following
+ criteria:
+
+ Kind Value Number of connections using
+ inet IPv4 and IPv6
+ inet4 IPv4
+ inet6 IPv6
+ tcp TCP
+ tcp4 TCP over IPv4
+ tcp6 TCP over IPv6
+ udp UDP
+ udp4 UDP over IPv4
+ udp6 UDP over IPv6
+ all the sum of all the possible families and protocols
+ """
inodes = {}
# os.listdir() is gonna raise a lot of access denied
# exceptions in case of unprivileged user; that's fine:
@@ -626,41 +633,65 @@ class Process(object):
# no connections for this process
return []
- def process(file, family, _type):
+ def process(file, family, type_):
retlist = []
- f = open(file)
+ try:
+ f = open(file, 'r')
+ except IOError, err:
+ # IPv6 not supported on this platform
+ if err.errno == errno.ENOENT and file.endswith('6'):
+ return []
+ else:
+ raise
try:
f.readline() # skip the first line
for line in f:
- _, laddr, raddr, status, _, _, _, _, _, inode = \
- line.split()[:10]
- if inode in inodes:
- laddr = self._decode_address(laddr, family)
- raddr = self._decode_address(raddr, family)
- if _type == socket.SOCK_STREAM:
- status = _TCP_STATES_TABLE[status]
- else:
- status = ""
- fd = int(inodes[inode])
- conn = ntuple_connection(fd, family, _type, laddr,
- raddr, status)
- retlist.append(conn)
+ # IPv4 / IPv6
+ if family in (socket.AF_INET, socket.AF_INET6):
+ _, laddr, raddr, status, _, _, _, _, _, inode = \
+ line.split()[:10]
+ if inode in inodes:
+ laddr = self._decode_address(laddr, family)
+ raddr = self._decode_address(raddr, family)
+ if type_ == socket.SOCK_STREAM:
+ status = _TCP_STATES_TABLE[status]
+ else:
+ status = ""
+ fd = int(inodes[inode])
+ conn = ntuple_connection(fd, family, type_, laddr,
+ raddr, status)
+ retlist.append(conn)
+ else:
+ raise ValueError(family)
return retlist
finally:
f.close()
- tcp4 = process("/proc/net/tcp", socket.AF_INET, socket.SOCK_STREAM)
- udp4 = process("/proc/net/udp", socket.AF_INET, socket.SOCK_DGRAM)
- try:
- tcp6 = process("/proc/net/tcp6", socket.AF_INET6, socket.SOCK_STREAM)
- udp6 = process("/proc/net/udp6", socket.AF_INET6, socket.SOCK_DGRAM)
- except IOError, err:
- if err.errno == errno.ENOENT:
- # IPv6 is not supported on this platform
- tcp6 = udp6 = []
- else:
- raise
- return tcp4 + tcp6 + udp4 + udp6
+ tcp4 = ("tcp" , socket.AF_INET , socket.SOCK_STREAM)
+ tcp6 = ("tcp6", socket.AF_INET6, socket.SOCK_STREAM)
+ udp4 = ("udp" , socket.AF_INET , socket.SOCK_DGRAM)
+ udp6 = ("udp6", socket.AF_INET6, socket.SOCK_DGRAM)
+
+ tmap = {
+ "all" : (tcp4, tcp6, udp4, udp6),
+ "tcp" : (tcp4, tcp6),
+ "tcp4" : (tcp4,),
+ "tcp6" : (tcp6,),
+ "udp" : (udp4, udp6),
+ "udp4" : (udp4,),
+ "udp6" : (udp6,),
+ "inet" : (tcp4, tcp6, udp4, udp6),
+ "inet4": (tcp4, udp4),
+ "inet6": (tcp6, udp6),
+ }
+ if kind not in tmap:
+ raise ValueError("invalid %r kind argument; choose between %s"
+ % (kind, ', '.join([repr(x) for x in tmap])))
+ ret = []
+ for f, family, type_ in tmap[kind]:
+ ret += process("/proc/net/%s" % f, family, type_)
+ return ret
+
# --- lsof implementation
#

Powered by Google App Engine
This is Rietveld 408576698