PageRenderTime 26ms CodeModel.GetById 16ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/thirdparty/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h

http://github.com/tomahawk-player/tomahawk
C++ Header | 105 lines | 48 code | 19 blank | 38 comment | 5 complexity | c78826647455a50be83a37fd4ff680da MD5 | raw file
  1// Copyright (c) 2005 - 2007, Google Inc.
  2// All rights reserved.
  3//
  4// Redistribution and use in source and binary forms, with or without
  5// modification, are permitted provided that the following conditions are
  6// met:
  7//
  8//     * Redistributions of source code must retain the above copyright
  9// notice, this list of conditions and the following disclaimer.
 10//     * Redistributions in binary form must reproduce the above
 11// copyright notice, this list of conditions and the following disclaimer
 12// in the documentation and/or other materials provided with the
 13// distribution.
 14//     * Neither the name of Google Inc. nor the names of its
 15// contributors may be used to endorse or promote products derived from
 16// this software without specific prior written permission.
 17//
 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 29//
 30// Author: Arun Sharma
 31//
 32// Produce stack trace using libgcc
 33
 34extern "C" {
 35#include <stdlib.h> // for NULL
 36#include <unwind.h> // ABI defined unwinder
 37}
 38#include "stacktrace.h"
 39
 40_START_GOOGLE_NAMESPACE_
 41
 42typedef struct {
 43  void **result;
 44  int max_depth;
 45  int skip_count;
 46  int count;
 47} trace_arg_t;
 48
 49
 50// Workaround for the malloc() in _Unwind_Backtrace() issue.
 51static _Unwind_Reason_Code nop_backtrace(struct _Unwind_Context *uc, void *opq) {
 52  return _URC_NO_REASON;
 53}
 54
 55
 56// This code is not considered ready to run until
 57// static initializers run so that we are guaranteed
 58// that any malloc-related initialization is done.
 59static bool ready_to_run = false;
 60class StackTraceInit {
 61 public:
 62   StackTraceInit() {
 63     // Extra call to force initialization
 64     _Unwind_Backtrace(nop_backtrace, NULL);
 65     ready_to_run = true;
 66   }
 67};
 68
 69static StackTraceInit module_initializer;  // Force initialization
 70
 71static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {
 72  trace_arg_t *targ = (trace_arg_t *) opq;
 73
 74  if (targ->skip_count > 0) {
 75    targ->skip_count--;
 76  } else {
 77    targ->result[targ->count++] = (void *) _Unwind_GetIP(uc);
 78  }
 79
 80  if (targ->count == targ->max_depth)
 81    return _URC_END_OF_STACK;
 82
 83  return _URC_NO_REASON;
 84}
 85
 86// If you change this function, also change GetStackFrames below.
 87int GetStackTrace(void** result, int max_depth, int skip_count) {
 88  if (!ready_to_run)
 89    return 0;
 90
 91  trace_arg_t targ;
 92
 93  skip_count += 1;         // Do not include the "GetStackTrace" frame
 94
 95  targ.result = result;
 96  targ.max_depth = max_depth;
 97  targ.skip_count = skip_count;
 98  targ.count = 0;
 99
100  _Unwind_Backtrace(GetOneFrame, &targ);
101
102  return targ.count;
103}
104
105_END_GOOGLE_NAMESPACE_