| Index: third_party/mozprocess/mozprocess/qijo.py
|
| ===================================================================
|
| --- third_party/mozprocess/mozprocess/qijo.py (revision 0)
|
| +++ third_party/mozprocess/mozprocess/qijo.py (revision 0)
|
| @@ -0,0 +1,140 @@
|
| +# This Source Code Form is subject to the terms of the Mozilla Public
|
| +# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
| +# You can obtain one at http://mozilla.org/MPL/2.0/.
|
| +
|
| +from ctypes import c_void_p, POINTER, sizeof, Structure, windll, WinError, WINFUNCTYPE, addressof, c_size_t, c_ulong
|
| +from ctypes.wintypes import BOOL, BYTE, DWORD, HANDLE, LARGE_INTEGER
|
| +
|
| +LPVOID = c_void_p
|
| +LPDWORD = POINTER(DWORD)
|
| +SIZE_T = c_size_t
|
| +ULONG_PTR = POINTER(c_ulong)
|
| +
|
| +# A ULONGLONG is a 64-bit unsigned integer.
|
| +# Thus there are 8 bytes in a ULONGLONG.
|
| +# XXX why not import c_ulonglong ?
|
| +ULONGLONG = BYTE * 8
|
| +
|
| +class IO_COUNTERS(Structure):
|
| + # The IO_COUNTERS struct is 6 ULONGLONGs.
|
| + # TODO: Replace with non-dummy fields.
|
| + _fields_ = [('dummy', ULONGLONG * 6)]
|
| +
|
| +class JOBOBJECT_BASIC_ACCOUNTING_INFORMATION(Structure):
|
| + _fields_ = [('TotalUserTime', LARGE_INTEGER),
|
| + ('TotalKernelTime', LARGE_INTEGER),
|
| + ('ThisPeriodTotalUserTime', LARGE_INTEGER),
|
| + ('ThisPeriodTotalKernelTime', LARGE_INTEGER),
|
| + ('TotalPageFaultCount', DWORD),
|
| + ('TotalProcesses', DWORD),
|
| + ('ActiveProcesses', DWORD),
|
| + ('TotalTerminatedProcesses', DWORD)]
|
| +
|
| +class JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION(Structure):
|
| + _fields_ = [('BasicInfo', JOBOBJECT_BASIC_ACCOUNTING_INFORMATION),
|
| + ('IoInfo', IO_COUNTERS)]
|
| +
|
| +# see http://msdn.microsoft.com/en-us/library/ms684147%28VS.85%29.aspx
|
| +class JOBOBJECT_BASIC_LIMIT_INFORMATION(Structure):
|
| + _fields_ = [('PerProcessUserTimeLimit', LARGE_INTEGER),
|
| + ('PerJobUserTimeLimit', LARGE_INTEGER),
|
| + ('LimitFlags', DWORD),
|
| + ('MinimumWorkingSetSize', SIZE_T),
|
| + ('MaximumWorkingSetSize', SIZE_T),
|
| + ('ActiveProcessLimit', DWORD),
|
| + ('Affinity', ULONG_PTR),
|
| + ('PriorityClass', DWORD),
|
| + ('SchedulingClass', DWORD)
|
| + ]
|
| +
|
| +class JOBOBJECT_ASSOCIATE_COMPLETION_PORT(Structure):
|
| + _fields_ = [('CompletionKey', c_ulong),
|
| + ('CompletionPort', HANDLE)]
|
| +
|
| +# see http://msdn.microsoft.com/en-us/library/ms684156%28VS.85%29.aspx
|
| +class JOBOBJECT_EXTENDED_LIMIT_INFORMATION(Structure):
|
| + _fields_ = [('BasicLimitInformation', JOBOBJECT_BASIC_LIMIT_INFORMATION),
|
| + ('IoInfo', IO_COUNTERS),
|
| + ('ProcessMemoryLimit', SIZE_T),
|
| + ('JobMemoryLimit', SIZE_T),
|
| + ('PeakProcessMemoryUsed', SIZE_T),
|
| + ('PeakJobMemoryUsed', SIZE_T)]
|
| +
|
| +# These numbers below come from:
|
| +# http://msdn.microsoft.com/en-us/library/ms686216%28v=vs.85%29.aspx
|
| +JobObjectAssociateCompletionPortInformation = 7
|
| +JobObjectBasicAndIoAccountingInformation = 8
|
| +JobObjectExtendedLimitInformation = 9
|
| +
|
| +class JobObjectInfo(object):
|
| + mapping = { 'JobObjectBasicAndIoAccountingInformation': 8,
|
| + 'JobObjectExtendedLimitInformation': 9,
|
| + 'JobObjectAssociateCompletionPortInformation': 7
|
| + }
|
| + structures = {
|
| + 7: JOBOBJECT_ASSOCIATE_COMPLETION_PORT,
|
| + 8: JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION,
|
| + 9: JOBOBJECT_EXTENDED_LIMIT_INFORMATION
|
| + }
|
| + def __init__(self, _class):
|
| + if isinstance(_class, basestring):
|
| + assert _class in self.mapping, 'Class should be one of %s; you gave %s' % (self.mapping, _class)
|
| + _class = self.mapping[_class]
|
| + assert _class in self.structures, 'Class should be one of %s; you gave %s' % (self.structures, _class)
|
| + self.code = _class
|
| + self.info = self.structures[_class]()
|
| +
|
| +
|
| +QueryInformationJobObjectProto = WINFUNCTYPE(
|
| + BOOL, # Return type
|
| + HANDLE, # hJob
|
| + DWORD, # JobObjectInfoClass
|
| + LPVOID, # lpJobObjectInfo
|
| + DWORD, # cbJobObjectInfoLength
|
| + LPDWORD # lpReturnLength
|
| + )
|
| +
|
| +QueryInformationJobObjectFlags = (
|
| + (1, 'hJob'),
|
| + (1, 'JobObjectInfoClass'),
|
| + (1, 'lpJobObjectInfo'),
|
| + (1, 'cbJobObjectInfoLength'),
|
| + (1, 'lpReturnLength', None)
|
| + )
|
| +
|
| +_QueryInformationJobObject = QueryInformationJobObjectProto(
|
| + ('QueryInformationJobObject', windll.kernel32),
|
| + QueryInformationJobObjectFlags
|
| + )
|
| +
|
| +class SubscriptableReadOnlyStruct(object):
|
| + def __init__(self, struct):
|
| + self._struct = struct
|
| +
|
| + def _delegate(self, name):
|
| + result = getattr(self._struct, name)
|
| + if isinstance(result, Structure):
|
| + return SubscriptableReadOnlyStruct(result)
|
| + return result
|
| +
|
| + def __getitem__(self, name):
|
| + match = [fname for fname, ftype in self._struct._fields_
|
| + if fname == name]
|
| + if match:
|
| + return self._delegate(name)
|
| + raise KeyError(name)
|
| +
|
| + def __getattr__(self, name):
|
| + return self._delegate(name)
|
| +
|
| +def QueryInformationJobObject(hJob, JobObjectInfoClass):
|
| + jobinfo = JobObjectInfo(JobObjectInfoClass)
|
| + result = _QueryInformationJobObject(
|
| + hJob=hJob,
|
| + JobObjectInfoClass=jobinfo.code,
|
| + lpJobObjectInfo=addressof(jobinfo.info),
|
| + cbJobObjectInfoLength=sizeof(jobinfo.info)
|
| + )
|
| + if not result:
|
| + raise WinError()
|
| + return SubscriptableReadOnlyStruct(jobinfo.info)
|
|
|
| Property changes on: third_party/mozprocess/mozprocess/qijo.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|