// Copyright (c) 2012 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. #ifndef BASE_LOCATION_H_ #define BASE_LOCATION_H_ #include <string> #include "base/base_export.h" #include "base/basictypes.h" namespace tracked_objects { // Location provides basic info where of an object was constructed, or was // significantly brought to life. class BASE_EXPORT Location { public: // Constructor should be called with a long-lived char*, such as __FILE__. // It assumes the provided value will persist as a global constant, and it // will not make a copy of it. Location(const char* function_name, const char* file_name, int line_number, const void* program_counter); // Provide a default constructor for easy of debugging. Location(); // Comparison operator for insertion into a std::map<> hash tables. // All we need is *some* (any) hashing distinction. Strings should already // be unique, so we don't bother with strcmp or such. // Use line number as the primary key (because it is fast, and usually gets us // a difference), and then pointers as secondary keys (just to get some // distinctions). bool operator < (const Location& other) const { if (line_number_ != other.line_number_) return line_number_ < other.line_number_; if (file_name_ != other.file_name_) return file_name_ < other.file_name_; return function_name_ < other.function_name_; } const char* function_name() const { return function_name_; } const char* file_name() const { return file_name_; } int line_number() const { return line_number_; } const void* program_counter() const { return program_counter_; } std::string ToString() const; // Translate the some of the state in this instance into a human readable // string with HTML characters in the function names escaped, and append that // string to |output|. Inclusion of the file_name_ and function_name_ are // optional, and controlled by the boolean arguments. void Write(bool display_filename, bool display_function_name, std::string* output) const; // Write function_name_ in HTML with '<' and '>' properly encoded. void WriteFunctionName(std::string* output) const; private: const char* function_name_; const char* file_name_; int line_number_; const void* program_counter_; }; // A "snapshotted" representation of the Location class that can safely be // passed across process boundaries. struct BASE_EXPORT LocationSnapshot { // The default constructor is exposed to support the IPC serialization macros. LocationSnapshot(); explicit LocationSnapshot(const tracked_objects::Location& location); ~LocationSnapshot(); std::string file_name; std::string function_name; int line_number; }; BASE_EXPORT const void* GetProgramCounter(); // Define a macro to record the current source location. #define FROM_HERE FROM_HERE_WITH_EXPLICIT_FUNCTION(__FUNCTION__) #define FROM_HERE_WITH_EXPLICIT_FUNCTION(function_name) \ ::tracked_objects::Location(function_name, \ __FILE__, \ __LINE__, \ ::tracked_objects::GetProgramCounter()) } // namespace tracked_objects #endif // BASE_LOCATION_H_