Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Unified Diff: tools/telemetry/telemetry/util/global_hooks.py

Issue 205243003: [telemetry] Consolidate global hooks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/telemetry/telemetry/util/exception_formatter.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « tools/telemetry/telemetry/util/exception_formatter.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698