128
134
ctypes.byref(mem_struct),
129
135
ctypes.sizeof(mem_struct))
131
trace.note('Failed to GetProcessMemoryInfo()')
137
trace.note(gettext('Failed to GetProcessMemoryInfo()'))
133
139
info = {'PageFaultCount': mem_struct.PageFaultCount,
134
140
'PeakWorkingSetSize': mem_struct.PeakWorkingSetSize,
149
155
proc = win32process.GetCurrentProcess()
150
156
info = win32process.GetProcessMemoryInfo(proc)
152
trace.note('Cannot debug memory on win32 without ctypes'
158
trace.note(gettext('Cannot debug memory on win32 without ctypes'
156
162
# using base-2 units (see HACKING.txt).
157
trace.note('WorkingSize %7dKiB'
158
'\tPeakWorking %7dKiB\t%s',
163
trace.note(gettext('WorkingSize {0:>7}KiB'
164
'\tPeakWorking {1:>7}KiB\t{2}').format(
159
165
info['WorkingSetSize'] / 1024,
160
166
info['PeakWorkingSetSize'] / 1024,
164
170
trace.note('%s', message)
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',
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'),
169
175
info.get('PeakPagefileUsage', 0) / 1024)
170
trace.note('PrivateUsage %8d KiB', info.get('PrivateUsage', 0) / 1024)
171
trace.note('PageFaultCount %8d', info.get('PageFaultCount', 0))
176
trace.note(gettext('PrivateUsage %8d KiB'), info.get('PrivateUsage', 0) / 1024)
177
trace.note(gettext('PageFaultCount %8d'), info.get('PageFaultCount', 0))
174
180
def get_console_size(defaultx=80, defaulty=25):
522
528
trace.mutter('Unable to set hidden attribute on %r: %s', path, e)
525
def _command_line_to_argv(command_line, single_quotes_allowed=False):
531
def _command_line_to_argv(command_line, argv, single_quotes_allowed=False):
526
532
"""Convert a Unicode command line into a list of argv arguments.
528
534
It performs wildcard expansion to make wildcards act closer to how they
536
542
:return: A list of unicode strings.
544
# First, spit the command line
538
545
s = cmdline.Splitter(command_line, single_quotes_allowed=single_quotes_allowed)
539
# Now that we've split the content, expand globs if necessary
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
540
561
# TODO: Use 'globbing' instead of 'glob.glob', this gives us stuff like
541
562
# '**/' style globs
543
for is_quoted, arg in s:
564
for is_quoted, arg in arguments:
544
565
if is_quoted or not glob.has_magic(arg):
557
578
if command_line is None:
558
579
raise ctypes.WinError()
559
580
# Skip the first argument, since we only care about parameters
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] != '-':
581
argv = _command_line_to_argv(command_line, sys.argv)[1:]
573
584
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):