Index: third_party/psutil/psutil/_psmswindows.py |
diff --git a/third_party/psutil/psutil/_psmswindows.py b/third_party/psutil/psutil/_psmswindows.py |
index ec75649594f22597b54278829f4409dc88f4a7f9..81ffad7b37e5cb9e3cc3eeded72912ede9aec788 100644 |
--- a/third_party/psutil/psutil/_psmswindows.py |
+++ b/third_party/psutil/psutil/_psmswindows.py |
@@ -1,69 +1,120 @@ |
#!/usr/bin/env python |
# |
-# $Id: _psmswindows.py 802 2010-11-12 22:15:29Z g.rodola $ |
+# $Id: _psmswindows.py 1142 2011-10-05 18:45:49Z 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 |
+# found in the LICENSE file. |
+ |
+"""Windows platform implementation.""" |
import errno |
import os |
-import subprocess |
-import socket |
-import re |
import sys |
import platform |
-try: |
- from collections import namedtuple |
-except ImportError: |
- from psutil.compat import namedtuple # python < 2.6 |
- |
import _psutil_mswindows |
-from psutil.error import AccessDenied, NoSuchProcess |
+from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired |
+from psutil._compat import namedtuple |
+from psutil._common import * |
+# Windows specific extended namespace |
+__extra__all__ = ["ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", |
+ "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", |
+ "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS"] |
# --- module level constants (gets pushed up to psutil module) |
NUM_CPUS = _psutil_mswindows.get_num_cpus() |
-TOTAL_PHYMEM = _psutil_mswindows.get_total_phymem() |
-_UPTIME = _psutil_mswindows.get_system_uptime() |
+BOOT_TIME = _psutil_mswindows.get_system_uptime() |
_WIN2000 = platform.win32_ver()[0] == '2000' |
- |
ERROR_ACCESS_DENIED = 5 |
+WAIT_TIMEOUT = 0x00000102 # 258 in decimal |
+ |
+# process priority constants: |
+# http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx |
+from _psutil_mswindows import (ABOVE_NORMAL_PRIORITY_CLASS, |
+ BELOW_NORMAL_PRIORITY_CLASS, |
+ HIGH_PRIORITY_CLASS, |
+ IDLE_PRIORITY_CLASS, |
+ NORMAL_PRIORITY_CLASS, |
+ REALTIME_PRIORITY_CLASS, |
+ INFINITE) |
# --- public functions |
-def avail_phymem(): |
- "Return the amount of physical memory available on the system, in bytes." |
- return _psutil_mswindows.get_avail_phymem() |
- |
-def used_phymem(): |
- "Return the amount of physical memory currently in use on the system, in bytes." |
- return TOTAL_PHYMEM - _psutil_mswindows.get_avail_phymem() |
- |
-def total_virtmem(): |
- "Return the amount of total virtual memory available on the system, in bytes." |
- return _psutil_mswindows.get_total_virtmem() |
- |
-def avail_virtmem(): |
- "Return the amount of virtual memory currently in use on the system, in bytes." |
- return _psutil_mswindows.get_avail_virtmem() |
- |
-def used_virtmem(): |
- """Return the amount of used memory currently in use on the system, in bytes.""" |
- return _psutil_mswindows.get_total_virtmem() - _psutil_mswindows.get_avail_virtmem() |
+def phymem_usage(): |
+ """Physical system memory as a (total, used, free) tuple.""" |
+ all = _psutil_mswindows.get_system_phymem() |
+ total, free, total_pagef, avail_pagef, total_virt, free_virt, percent = all |
+ used = total - free |
+ return ntuple_sysmeminfo(total, used, free, round(percent, 1)) |
+ |
+def virtmem_usage(): |
+ """Virtual system memory as a (total, used, free) tuple.""" |
+ all = _psutil_mswindows.get_system_phymem() |
+ total_virt = all[4] |
+ free_virt = all[5] |
+ used = total_virt - free_virt |
+ percent = usage_percent(used, total_virt, _round=1) |
+ return ntuple_sysmeminfo(total_virt, used, free_virt, percent) |
+ |
+def get_disk_usage(path): |
+ """Return disk usage associated with path.""" |
+ try: |
+ total, free = _psutil_mswindows.get_disk_usage(path) |
+ except WindowsError, err: |
+ if not os.path.exists(path): |
+ raise OSError(errno.ENOENT, "No such file or directory: '%s'" % path) |
+ raise |
+ used = total - free |
+ percent = usage_percent(used, total, _round=1) |
+ return ntuple_diskinfo(total, used, free, percent) |
+ |
+def disk_partitions(all): |
+ """Return disk partitions.""" |
+ retlist = [] |
+ drive_letters = _psutil_mswindows.win32_GetLogicalDriveStrings() |
+ for letter in drive_letters: |
+ mountpoint = letter |
+ type = _psutil_mswindows.win32_GetDriveType(letter) |
+ if not os.path.exists(mountpoint): |
+ # usually a CD-ROM device with no disk inserted |
+ mountpoint = "" |
+ if not all: |
+ if type not in ('cdrom', 'fixed', 'removable'): |
+ continue |
+ if not mountpoint: |
+ continue |
+ ntuple = ntuple_partition(letter, mountpoint, type) |
+ retlist.append(ntuple) |
+ return retlist |
+ |
+ |
+_cputimes_ntuple = namedtuple('cputimes', 'user system idle') |
def get_system_cpu_times(): |
- """Return a dict representing the following CPU times: user, system, idle.""" |
- times = _psutil_mswindows.get_system_cpu_times() |
- return dict(user=times[0], system=times[1], idle=times[2]) |
- |
-def get_pid_list(): |
- """Returns a list of PIDs currently running on the system.""" |
- return _psutil_mswindows.get_pid_list() |
- |
-def pid_exists(pid): |
- return _psutil_mswindows.pid_exists(pid) |
- |
+ """Return system CPU times as a named tuple.""" |
+ user, system, idle = 0, 0, 0 |
+ # computes system global times summing each processor value |
+ for cpu_time in _psutil_mswindows.get_system_cpu_times(): |
+ user += cpu_time[0] |
+ system += cpu_time[1] |
+ idle += cpu_time[2] |
+ return _cputimes_ntuple(user, system, idle) |
+ |
+def get_system_per_cpu_times(): |
+ """Return system per-CPU times as a list of named tuples.""" |
+ ret = [] |
+ for cpu_t in _psutil_mswindows.get_system_cpu_times(): |
+ user, system, idle = cpu_t |
+ item = _cputimes_ntuple(user, system, idle) |
+ ret.append(item) |
+ return ret |
+ |
+get_pid_list = _psutil_mswindows.get_pid_list |
+pid_exists = _psutil_mswindows.pid_exists |
# --- decorator |
@@ -84,14 +135,9 @@ def wrap_exceptions(callable): |
return wrapper |
-class WindowsProcess(object): |
+class Process(object): |
"""Wrapper class around underlying C implementation.""" |
- _meminfo_ntuple = namedtuple('meminfo', 'rss vms') |
- _cputimes_ntuple = namedtuple('cputimes', 'user system') |
- _openfile_ntuple = namedtuple('openfile', 'path fd') |
- _connection_ntuple = namedtuple('connection', 'fd family type local_address ' |
- 'remote_address status') |
__slots__ = ["pid", "_process_name"] |
def __init__(self, pid): |
@@ -105,10 +151,12 @@ class WindowsProcess(object): |
return _psutil_mswindows.get_process_name(self.pid) |
def get_process_exe(self): |
- # no such thing as "exe" on BSD; it will maybe be determined |
+ # no such thing as "exe" on Windows; it will maybe be determined |
# later from cmdline[0] |
if not pid_exists(self.pid): |
raise NoSuchProcess(self.pid, self._process_name) |
+ if self.pid in (0, 4): |
+ raise AccessDenied(self.pid, self._process_name) |
return "" |
@wrap_exceptions |
@@ -121,26 +169,14 @@ class WindowsProcess(object): |
"""Return process parent pid.""" |
return _psutil_mswindows.get_process_ppid(self.pid) |
- def get_process_uid(self): |
- # no such thing as uid on Windows |
- if not pid_exists(self.pid): |
- raise NoSuchProcess(self.pid, self._process_name) |
- return -1 |
- |
- def get_process_gid(self): |
- # no such thing as gid on Windows |
- if not pid_exists(self.pid): |
- raise NoSuchProcess(self.pid, self._process_name) |
- return -1 |
- |
@wrap_exceptions |
def get_memory_info(self): |
"""Returns a tuple or RSS/VMS memory usage in bytes.""" |
# special case for 0 (kernel processes) PID |
if self.pid == 0: |
- return self._meminfo_ntuple(0, 0) |
+ return ntuple_meminfo(0, 0) |
rss, vms = _psutil_mswindows.get_memory_info(self.pid) |
- return self._meminfo_ntuple(rss, vms) |
+ return ntuple_meminfo(rss, vms) |
@wrap_exceptions |
def kill_process(self): |
@@ -148,6 +184,18 @@ class WindowsProcess(object): |
return _psutil_mswindows.kill_process(self.pid) |
@wrap_exceptions |
+ def process_wait(self, timeout=None): |
+ if timeout is None: |
+ timeout = INFINITE |
+ else: |
+ # WaitForSingleObject() expects time in milliseconds |
+ timeout = int(timeout * 1000) |
+ ret = _psutil_mswindows.process_wait(self.pid, timeout) |
+ if ret == WAIT_TIMEOUT: |
+ raise TimeoutExpired(self.pid, self._process_name) |
+ return ret |
+ |
+ @wrap_exceptions |
def get_process_username(self): |
"""Return the name of the user that owns the process""" |
if self.pid in (0, 4) or self.pid == 8 and _WIN2000: |
@@ -156,9 +204,9 @@ class WindowsProcess(object): |
@wrap_exceptions |
def get_process_create_time(self): |
- # special case for kernel process PIDs; return system uptime |
+ # special case for kernel process PIDs; return system boot time |
if self.pid in (0, 4) or self.pid == 8 and _WIN2000: |
- return _UPTIME |
+ return BOOT_TIME |
return _psutil_mswindows.get_process_create_time(self.pid) |
@wrap_exceptions |
@@ -166,20 +214,31 @@ class WindowsProcess(object): |
return _psutil_mswindows.get_process_num_threads(self.pid) |
@wrap_exceptions |
+ def get_process_threads(self): |
+ rawlist = _psutil_mswindows.get_process_threads(self.pid) |
+ retlist = [] |
+ for thread_id, utime, stime in rawlist: |
+ ntuple = ntuple_thread(thread_id, utime, stime) |
+ retlist.append(ntuple) |
+ return retlist |
+ |
+ @wrap_exceptions |
def get_cpu_times(self): |
user, system = _psutil_mswindows.get_process_cpu_times(self.pid) |
- return self._cputimes_ntuple(user, system) |
+ return ntuple_cputimes(user, system) |
+ @wrap_exceptions |
def suspend_process(self): |
return _psutil_mswindows.suspend_process(self.pid) |
+ @wrap_exceptions |
def resume_process(self): |
return _psutil_mswindows.resume_process(self.pid) |
@wrap_exceptions |
def get_process_cwd(self): |
if self.pid in (0, 4) or self.pid == 8 and _WIN2000: |
- return '' |
+ raise AccessDenied(self.pid, self._process_name) |
# return a normalized pathname since the native C function appends |
# "\\" at the and of the path |
path = _psutil_mswindows.get_process_cwd(self.pid) |
@@ -200,16 +259,35 @@ class WindowsProcess(object): |
file = file.decode('utf8') |
if file.startswith('\\Device\\'): |
rawdrive = '\\'.join(file.split('\\')[:3]) |
- driveletter = _psutil_mswindows._QueryDosDevice(rawdrive) |
+ driveletter = _psutil_mswindows.win32_QueryDosDevice(rawdrive) |
file = file.replace(rawdrive, driveletter) |
if os.path.isfile(file) and file not in retlist: |
- ntuple = self._openfile_ntuple(file, -1) |
+ ntuple = ntuple_openfile(file, -1) |
retlist.append(ntuple) |
return retlist |
@wrap_exceptions |
def get_connections(self): |
retlist = _psutil_mswindows.get_process_connections(self.pid) |
- return [self._connection_ntuple(*conn) for conn in retlist] |
+ return [ntuple_connection(*conn) for conn in retlist] |
-PlatformProcess = WindowsProcess |
+ @wrap_exceptions |
+ def get_process_nice(self): |
+ return _psutil_mswindows.get_process_priority(self.pid) |
+ |
+ @wrap_exceptions |
+ def set_process_nice(self, value): |
+ return _psutil_mswindows.set_process_priority(self.pid, value) |
+ |
+ @wrap_exceptions |
+ def get_process_io_counters(self): |
+ rc, wc, rb, wb =_psutil_mswindows.get_process_io_counters(self.pid) |
+ return ntuple_io(rc, wc, rb, wb) |
+ |
+ @wrap_exceptions |
+ def get_process_status(self): |
+ suspended = _psutil_mswindows.is_process_suspended(self.pid) |
+ if suspended: |
+ return STATUS_STOPPED |
+ else: |
+ return STATUS_RUNNING |