Back to index

enigmail  1.4.3
procmem.py
Go to the documentation of this file.
00001 # ***** BEGIN LICENSE BLOCK *****
00002 # Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003 #
00004 # The contents of this file are subject to the Mozilla Public License Version
00005 # 1.1 (the "License"); you may not use this file except in compliance with
00006 # the License. You may obtain a copy of the License at
00007 # http://www.mozilla.org/MPL/
00008 #
00009 # Software distributed under the License is distributed on an "AS IS" basis,
00010 # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011 # for the specific language governing rights and limitations under the
00012 # License.
00013 #
00014 # The Original Code is cl.py: a python wrapper for cl to automatically generate
00015 # dependency information.
00016 #
00017 # The Initial Developer of the Original Code is
00018 #   Mozilla Foundation.
00019 # Portions created by the Initial Developer are Copyright (C) 2010
00020 # the Initial Developer. All Rights Reserved.
00021 #
00022 # Contributor(s):
00023 #   Ted Mielczarek <ted@mielczarek.org>
00024 #
00025 # Alternatively, the contents of this file may be used under the terms of
00026 # either the GNU General Public License Version 2 or later (the "GPL"), or
00027 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028 # in which case the provisions of the GPL or the LGPL are applicable instead
00029 # of those above. If you wish to allow use of your version of this file only
00030 # under the terms of either the GPL or the LGPL, and not to allow others to
00031 # use your version of this file under the terms of the MPL, indicate your
00032 # decision by deleting the provisions above and replace them with the notice
00033 # and other provisions required by the GPL or the LGPL. If you do not delete
00034 # the provisions above, a recipient may use your version of this file under
00035 # the terms of any one of the MPL, the GPL or the LGPL.
00036 #
00037 # ***** END LICENSE BLOCK *****
00038 
00039 import os, sys, ctypes, ctypes.wintypes
00040 
00041 class VM_COUNTERS(ctypes.Structure):
00042     _fields_ = [("PeakVirtualSize", ctypes.wintypes.ULONG),
00043                 ("VirtualSize", ctypes.wintypes.ULONG),
00044                 ("PageFaultCount", ctypes.wintypes.ULONG),
00045                 ("PeakWorkingSetSize", ctypes.wintypes.ULONG),
00046                 ("WorkingSetSize", ctypes.wintypes.ULONG),
00047                 ("QuotaPeakPagedPoolUsage", ctypes.wintypes.ULONG),
00048                 ("QuotaPagedPoolUsage", ctypes.wintypes.ULONG),
00049                 ("QuotaPeakNonPagedPoolUsage", ctypes.wintypes.ULONG),
00050                 ("QuotaNonPagedPoolUsage", ctypes.wintypes.ULONG),
00051                 ("PagefileUsage", ctypes.wintypes.ULONG),
00052                 ("PeakPagefileUsage", ctypes.wintypes.ULONG)
00053                 ]
00054 
00055 def get_vmsize(handle):
00056     """
00057     Return (peak_virtual_size, virtual_size) for the process |handle|.
00058     """
00059     ProcessVmCounters = 3
00060     vmc = VM_COUNTERS()
00061     if ctypes.windll.ntdll.NtQueryInformationProcess(int(handle),
00062                                                      ProcessVmCounters,
00063                                                      ctypes.byref(vmc),
00064                                                      ctypes.sizeof(vmc),
00065                                                      None) == 0:
00066        return (vmc.PeakVirtualSize, vmc.VirtualSize)
00067 
00068     return (-1, -1)
00069 
00070 if __name__ == '__main__':
00071     PROCESS_QUERY_INFORMATION = 0x0400
00072     for pid in sys.argv[1:]:
00073         handle = ctypes.windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION,
00074                                                     0, # no inherit
00075                                                     int(pid))
00076         if handle:
00077             print "Process %s:" % pid
00078             vsize, peak_vsize = get_vmsize(handle)
00079             print "peak vsize: %d" % peak_vsize
00080             ctypes.windll.kernel32.CloseHandle(handle)
00081         else:
00082             print "Couldn't open process %s" % pid