DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (409f3966645a)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#!/usr/bin/env python

# 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 __future__ import absolute_import, print_function

import os
import subprocess
import sys

import xtalos


def start(xperf_path, xperf_providers, xperf_stackwalk, xperf_user_providers,
          etl_filename, debug=False):

    xperf_cmd = [xperf_path,
                 '-on', '+'.join(xperf_providers),
                 '-stackwalk', '+'.join(xperf_stackwalk),
                 '-MaxBuffers', '1024',
                 '-BufferSize', '1024',
                 '-f', '%s.kernel' % etl_filename,
                 '-start', 'talos_ses',
                 '-on', '+'.join(xperf_user_providers),
                 '-MaxBuffers', '1024',
                 '-BufferSize', '1024',
                 '-f', '%s.user' % etl_filename
                 ]
    if debug:
        print("executing '%s'" % subprocess.list2cmdline(xperf_cmd))
    subprocess.call(xperf_cmd)


def start_from_config(config_file=None, debug=False, **kwargs):
    """start from a YAML config file"""

    # required options and associated error messages
    required = {'xperf_path': "xperf_path not given",
                'xperf_providers': "No xperf providers given",
                'xperf_user_providers': "No xperf user providers given",
                'xperf_stackwalk': "No xperf stackwalk options given",
                "etl_filename": "No etl_filename given"}
    for key in required:
        if key not in kwargs:
            kwargs[key] = None

    if config_file:
        # override options from YAML config file
        kwargs = xtalos.options_from_config(kwargs, config_file)

    # ensure the required options are given
    for key, msg in required.items():
        if not kwargs.get(key):
            raise xtalos.XTalosError(msg)

    # ensure path to xperf actually exists
    if not os.path.exists(kwargs['xperf_path']):
        raise xtalos.XTalosError("ERROR: xperf_path '%s' does not exist"
                                 % kwargs['xperf_path'])

    # make calling arguments
    args = dict([(key, kwargs[key]) for key in required.keys()])
    args['debug'] = debug

    # call start
    start(**args)


def main(args=sys.argv[1:]):

    # parse command line options
    parser = xtalos.XtalosOptions()
    args = parser.parse_args(args)

    # start xperf
    try:
        start_from_config(config_file=args.configFile,
                          debug=args.debug_level >= xtalos.DEBUG_INFO,
                          **args.__dict__)
    except xtalos.XTalosError as e:
        parser.error(str(e))


if __name__ == "__main__":
    main()