| Index: tools/telemetry/telemetry/util/global_hooks.py
|
| diff --git a/tools/telemetry/telemetry/util/global_hooks.py b/tools/telemetry/telemetry/util/global_hooks.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..50ed5b5f3b4d4831c8c20e0bf45bacc9bf942d2f
|
| --- /dev/null
|
| +++ b/tools/telemetry/telemetry/util/global_hooks.py
|
| @@ -0,0 +1,75 @@
|
| +# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Hooks that apply globally to all scripts that import or use Telemetry."""
|
| +
|
| +import os
|
| +import signal
|
| +import sys
|
| +import traceback
|
| +
|
| +from telemetry.core import util
|
| +from telemetry.util import exception_formatter
|
| +
|
| +
|
| +def InstallHooks():
|
| + RemoveAllStalePycFiles(util.GetTelemetryDir())
|
| + RemoveAllStalePycFiles(util.GetBaseDir())
|
| + InstallUnhandledExceptionFormatter()
|
| + InstallStackDumpOnSigusr1()
|
| + InstallTerminationHook()
|
| +
|
| +
|
| +def RemoveAllStalePycFiles(base_dir):
|
| + """Scan directories for old .pyc files without a .py file and delete them."""
|
| + for dirname, _, filenames in os.walk(base_dir):
|
| + if '.svn' in dirname or '.git' in dirname:
|
| + continue
|
| + for filename in filenames:
|
| + root, ext = os.path.splitext(filename)
|
| + if ext != '.pyc':
|
| + continue
|
| +
|
| + pyc_path = os.path.join(dirname, filename)
|
| + py_path = os.path.join(dirname, root + '.py')
|
| +
|
| + try:
|
| + if not os.path.exists(py_path):
|
| + os.remove(pyc_path)
|
| + except OSError:
|
| + # Wrap OS calls in try/except in case another process touched this file.
|
| + pass
|
| +
|
| + try:
|
| + os.removedirs(dirname)
|
| + except OSError:
|
| + # Wrap OS calls in try/except in case another process touched this dir.
|
| + pass
|
| +
|
| +
|
| +def InstallUnhandledExceptionFormatter():
|
| + """Print prettier exceptions that also contain the stack frame's locals."""
|
| + sys.excepthook = exception_formatter.PrintFormattedException
|
| +
|
| +
|
| +def InstallStackDumpOnSigusr1():
|
| + """Catch SIGUSR1 and print a stack trace."""
|
| + # Windows doesn't define SIGUSR1.
|
| + if not hasattr(signal, 'SIGUSR1'):
|
| + return
|
| +
|
| + def PrintDiagnostics(_, stack_frame):
|
| + print >> sys.stderr, 'SIGUSR1 received, printing stack trace:'
|
| + traceback.print_stack(stack_frame)
|
| + signal.signal(signal.SIGUSR1, PrintDiagnostics)
|
| +
|
| +
|
| +def InstallTerminationHook():
|
| + """Catch SIGTERM, print a stack trace, and exit."""
|
| + def PrintStackAndExit(sig, stack_frame):
|
| + print >> sys.stderr, 'Traceback (most recent call last):'
|
| + traceback.print_stack(stack_frame)
|
| + print >> sys.stderr, 'Received signal %s, exiting' % sig
|
| + sys.exit(-1)
|
| + signal.signal(signal.SIGTERM, PrintStackAndExit)
|
|
|