134
128
ctypes.byref(mem_struct),
135
129
ctypes.sizeof(mem_struct))
137
trace.note(gettext('Failed to GetProcessMemoryInfo()'))
131
trace.note('Failed to GetProcessMemoryInfo()')
139
133
info = {'PageFaultCount': mem_struct.PageFaultCount,
140
134
'PeakWorkingSetSize': mem_struct.PeakWorkingSetSize,
155
149
proc = win32process.GetCurrentProcess()
156
150
info = win32process.GetProcessMemoryInfo(proc)
158
trace.note(gettext('Cannot debug memory on win32 without ctypes'
152
trace.note('Cannot debug memory on win32 without ctypes'
162
156
# using base-2 units (see HACKING.txt).
163
trace.note(gettext('WorkingSize {0:>7}KiB'
164
'\tPeakWorking {1:>7}KiB\t{2}').format(
157
trace.note('WorkingSize %7dKiB'
158
'\tPeakWorking %7dKiB\t%s',
165
159
info['WorkingSetSize'] / 1024,
166
160
info['PeakWorkingSetSize'] / 1024,
170
164
trace.note('%s', message)
171
trace.note(gettext('WorkingSize %8d KiB'), info['WorkingSetSize'] / 1024)
172
trace.note(gettext('PeakWorking %8d KiB'), info['PeakWorkingSetSize'] / 1024)
173
trace.note(gettext('PagefileUsage %8d KiB'), info.get('PagefileUsage', 0) / 1024)
174
trace.note(gettext('PeakPagefileUsage %8d KiB'),
165
trace.note('WorkingSize %8d KiB', info['WorkingSetSize'] / 1024)
166
trace.note('PeakWorking %8d KiB', info['PeakWorkingSetSize'] / 1024)
167
trace.note('PagefileUsage %8d KiB', info.get('PagefileUsage', 0) / 1024)
168
trace.note('PeakPagefileUsage %8d KiB',
175
169
info.get('PeakPagefileUsage', 0) / 1024)
176
trace.note(gettext('PrivateUsage %8d KiB'), info.get('PrivateUsage', 0) / 1024)
177
trace.note(gettext('PageFaultCount %8d'), info.get('PageFaultCount', 0))
170
trace.note('PrivateUsage %8d KiB', info.get('PrivateUsage', 0) / 1024)
171
trace.note('PageFaultCount %8d', info.get('PageFaultCount', 0))
180
174
def get_console_size(defaultx=80, defaulty=25):
528
522
trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
531
def _command_line_to_argv(command_line, argv, single_quotes_allowed=False):
525
def _command_line_to_argv(command_line, single_quotes_allowed=False):
532
526
"""Convert a Unicode command line into a list of argv arguments.
534
528
It performs wildcard expansion to make wildcards act closer to how they
542
536
:return: A list of unicode strings.
544
# First, spit the command line
545
538
s = cmdline.Splitter(command_line, single_quotes_allowed=single_quotes_allowed)
547
# Bug #587868 Now make sure that the length of s agrees with sys.argv
548
# we do this by simply counting the number of arguments in each. The counts should
549
# agree no matter what encoding sys.argv is in (AFAIK)
550
# len(arguments) < len(sys.argv) should be an impossibility since python gets
551
# args from the very same PEB as does GetCommandLineW
554
# Now shorten the command line we get from GetCommandLineW to match sys.argv
555
if len(arguments) < len(argv):
556
raise AssertionError("Split command line can't be shorter than argv")
557
arguments = arguments[len(arguments) - len(argv):]
559
# Carry on to process globs (metachars) in the command line
560
# expand globs if necessary
539
# Now that we've split the content, expand globs if necessary
561
540
# TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
562
541
# '**/' style globs
564
for is_quoted, arg in arguments:
543
for is_quoted, arg in s:
565
544
if is_quoted or not glob.has_magic(arg):
578
557
if command_line is None:
579
558
raise ctypes.WinError()
580
559
# Skip the first argument, since we only care about parameters
581
argv = _command_line_to_argv(command_line, sys.argv)[1:]
560
argv = _command_line_to_argv(command_line)[1:]
561
if getattr(sys, 'frozen', None) is None:
562
# Invoked via 'python.exe' which takes the form:
563
# python.exe [PYTHON_OPTIONS] C:\Path\bzr [BZR_OPTIONS]
564
# we need to get only BZR_OPTIONS part,
565
# We already removed 'python.exe' so we remove everything up to and
566
# including the first non-option ('-') argument.
567
for idx in xrange(len(argv)):
568
if argv[idx][:1] != '-':
584
573
get_unicode_argv = None
588
def _pywin32_is_local_pid_dead(pid):
589
"""True if pid doesn't correspond to live process on this machine"""
591
handle = win32api.OpenProcess(1, False, pid) # PROCESS_TERMINATE
592
except pywintypes.error, e:
593
if e[0] == 5: # ERROR_ACCESS_DENIED
594
# Probably something alive we're not allowed to kill
596
elif e[0] == 87: # ERROR_INVALID_PARAMETER
601
is_local_pid_dead = _pywin32_is_local_pid_dead
602
elif has_ctypes and sys.platform == 'win32':
603
from ctypes.wintypes import BOOL, DWORD, HANDLE
604
_kernel32 = ctypes.windll.kernel32
605
_CloseHandle = ctypes.WINFUNCTYPE(BOOL, HANDLE)(
606
("CloseHandle", _kernel32))
607
_OpenProcess = ctypes.WINFUNCTYPE(HANDLE, DWORD, BOOL, DWORD)(
608
("OpenProcess", _kernel32))
609
def _ctypes_is_local_pid_dead(pid):
610
"""True if pid doesn't correspond to live process on this machine"""
611
handle = _OpenProcess(1, False, pid) # PROCESS_TERMINATE
613
errorcode = ctypes.GetLastError()
614
if errorcode == 5: # ERROR_ACCESS_DENIED
615
# Probably something alive we're not allowed to kill
617
elif errorcode == 87: # ERROR_INVALID_PARAMETER
619
raise ctypes.WinError(errorcode)
622
is_local_pid_dead = _ctypes_is_local_pid_dead
625
def _is_pywintypes_error(evalue):
626
"""True if exception instance is an error from pywin32"""
627
if has_pywintypes and isinstance(evalue, pywintypes.error):