PageRenderTime 24ms CodeModel.GetById 16ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/thirdparty/breakpad/processor/basic_code_modules.cc

http://github.com/tomahawk-player/tomahawk
C++ | 123 lines | 63 code | 18 blank | 42 comment | 5 complexity | 380734171a7b46d57804c8a53a52a06a MD5 | raw file
  1// Copyright (c) 2006, 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// basic_code_modules.cc: Contains all of the CodeModule objects that
 31// were loaded into a single process.
 32//
 33// See basic_code_modules.h for documentation.
 34//
 35// Author: Mark Mentovai
 36
 37#include "processor/basic_code_modules.h"
 38
 39#include <assert.h>
 40
 41#include "google_breakpad/processor/code_module.h"
 42#include "processor/linked_ptr.h"
 43#include "processor/logging.h"
 44#include "processor/range_map-inl.h"
 45
 46namespace google_breakpad {
 47
 48BasicCodeModules::BasicCodeModules(const CodeModules *that)
 49    : main_address_(0),
 50      map_(new RangeMap<u_int64_t, linked_ptr<const CodeModule> >()) {
 51  BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires "
 52                            "|that|";
 53  assert(that);
 54
 55  const CodeModule *main_module = that->GetMainModule();
 56  if (main_module)
 57    main_address_ = main_module->base_address();
 58
 59  unsigned int count = that->module_count();
 60  for (unsigned int module_sequence = 0;
 61       module_sequence < count;
 62       ++module_sequence) {
 63    // Make a copy of the module and insert it into the map.  Use
 64    // GetModuleAtIndex because ordering is unimportant when slurping the
 65    // entire list, and GetModuleAtIndex may be faster than
 66    // GetModuleAtSequence.
 67    const CodeModule *module = that->GetModuleAtIndex(module_sequence)->Copy();
 68    if (!map_->StoreRange(module->base_address(), module->size(),
 69                          linked_ptr<const CodeModule>(module))) {
 70      BPLOG(ERROR) << "Module " << module->code_file() <<
 71                      " could not be stored";
 72    }
 73  }
 74}
 75
 76BasicCodeModules::~BasicCodeModules() {
 77  delete map_;
 78}
 79
 80unsigned int BasicCodeModules::module_count() const {
 81  return map_->GetCount();
 82}
 83
 84const CodeModule* BasicCodeModules::GetModuleForAddress(
 85    u_int64_t address) const {
 86  linked_ptr<const CodeModule> module;
 87  if (!map_->RetrieveRange(address, &module, NULL, NULL)) {
 88    BPLOG(INFO) << "No module at " << HexString(address);
 89    return NULL;
 90  }
 91
 92  return module.get();
 93}
 94
 95const CodeModule* BasicCodeModules::GetMainModule() const {
 96  return GetModuleForAddress(main_address_);
 97}
 98
 99const CodeModule* BasicCodeModules::GetModuleAtSequence(
100    unsigned int sequence) const {
101  linked_ptr<const CodeModule> module;
102  if (!map_->RetrieveRangeAtIndex(sequence, &module, NULL, NULL)) {
103    BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence;
104    return NULL;
105  }
106
107  return module.get();
108}
109
110const CodeModule* BasicCodeModules::GetModuleAtIndex(
111    unsigned int index) const {
112  // This class stores everything in a RangeMap, without any more-efficient
113  // way to walk the list of CodeModule objects.  Implement GetModuleAtIndex
114  // using GetModuleAtSequence, which meets all of the requirements, and
115  // in addition, guarantees ordering.
116  return GetModuleAtSequence(index);
117}
118
119const CodeModules* BasicCodeModules::Copy() const {
120  return new BasicCodeModules(this);
121}
122
123}  // namespace google_breakpad