| // 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_DEBUG_CRASH_LOGGING_H_ | 
 | #define BASE_DEBUG_CRASH_LOGGING_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/strings/string_piece.h" | 
 |  | 
 | namespace base { | 
 | namespace debug { | 
 |  | 
 | // A crash key is an annotation that is carried along with a crash report, to | 
 | // provide additional debugging information beyond a stack trace. Crash keys | 
 | // have a name and a string value. | 
 | // | 
 | // The preferred API is //components/crash/core/common:crash_key, however not | 
 | // all clients can hold a direct dependency on that target. The API provided | 
 | // in this file indirects the dependency. | 
 | // | 
 | // Example usage: | 
 | //   static CrashKeyString* crash_key = | 
 | //       AllocateCrashKeyString("name", CrashKeySize::Size32); | 
 | //   SetCrashKeyString(crash_key, "value"); | 
 | //   ClearCrashKeyString(crash_key); | 
 |  | 
 | // The maximum length for a crash key's value must be one of the following | 
 | // pre-determined values. | 
 | enum class CrashKeySize { | 
 |   Size32 = 32, | 
 |   Size64 = 64, | 
 |   Size256 = 256, | 
 | }; | 
 |  | 
 | struct CrashKeyString; | 
 |  | 
 | // Allocates a new crash key with the specified |name| with storage for a | 
 | // value up to length |size|. This will return null if the crash key system is | 
 | // not initialized. | 
 | BASE_EXPORT CrashKeyString* AllocateCrashKeyString(const char name[], | 
 |                                                    CrashKeySize size); | 
 |  | 
 | // Stores |value| into the specified |crash_key|. The |crash_key| may be null | 
 | // if AllocateCrashKeyString() returned null. If |value| is longer than the | 
 | // size with which the key was allocated, it will be truncated. | 
 | BASE_EXPORT void SetCrashKeyString(CrashKeyString* crash_key, | 
 |                                    base::StringPiece value); | 
 |  | 
 | // Clears any value that was stored in |crash_key|. The |crash_key| may be | 
 | // null. | 
 | BASE_EXPORT void ClearCrashKeyString(CrashKeyString* crash_key); | 
 |  | 
 | // A scoper that sets the specified key to value for the lifetime of the | 
 | // object, and clears it on destruction. | 
 | class BASE_EXPORT ScopedCrashKeyString { | 
 |  public: | 
 |   ScopedCrashKeyString(CrashKeyString* crash_key, base::StringPiece value); | 
 |   ~ScopedCrashKeyString(); | 
 |  | 
 |  private: | 
 |   CrashKeyString* const crash_key_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopedCrashKeyString); | 
 | }; | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | // The following declarations are used to initialize the crash key system | 
 | // in //base by providing implementations for the above functions. | 
 |  | 
 | // The virtual interface that provides the implementation for the crash key | 
 | // API. This is implemented by a higher-layer component, and the instance is | 
 | // set using the function below. | 
 | class CrashKeyImplementation { | 
 |  public: | 
 |   virtual ~CrashKeyImplementation() = default; | 
 |  | 
 |   virtual CrashKeyString* Allocate(const char name[], CrashKeySize size) = 0; | 
 |   virtual void Set(CrashKeyString* crash_key, base::StringPiece value) = 0; | 
 |   virtual void Clear(CrashKeyString* crash_key) = 0; | 
 | }; | 
 |  | 
 | // Initializes the crash key system in base by replacing the existing | 
 | // implementation, if it exists, with |impl|. The |impl| is copied into base. | 
 | BASE_EXPORT void SetCrashKeyImplementation( | 
 |     std::unique_ptr<CrashKeyImplementation> impl); | 
 |  | 
 | // The base structure for a crash key, storing the allocation metadata. | 
 | struct CrashKeyString { | 
 |   constexpr CrashKeyString(const char name[], CrashKeySize size) | 
 |       : name(name), size(size) {} | 
 |   const char* const name; | 
 |   const CrashKeySize size; | 
 | }; | 
 |  | 
 | }  // namespace debug | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_DEBUG_CRASH_LOGGING_H_ |