|  | // Copyright 2015 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_FILES_FILE_TRACING_H_ | 
|  | #define BASE_FILES_FILE_TRACING_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/macros.h" | 
|  |  | 
|  | #define FILE_TRACING_PREFIX "File" | 
|  |  | 
|  | #define SCOPED_FILE_TRACE_WITH_SIZE(name, size) \ | 
|  | FileTracing::ScopedTrace scoped_file_trace; \ | 
|  | if (FileTracing::IsCategoryEnabled()) \ | 
|  | scoped_file_trace.Initialize(FILE_TRACING_PREFIX "::" name, this, size) | 
|  |  | 
|  | #define SCOPED_FILE_TRACE(name) SCOPED_FILE_TRACE_WITH_SIZE(name, 0) | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | class File; | 
|  | class FilePath; | 
|  |  | 
|  | class BASE_EXPORT FileTracing { | 
|  | public: | 
|  | // Whether the file tracing category is enabled. | 
|  | static bool IsCategoryEnabled(); | 
|  |  | 
|  | class Provider { | 
|  | public: | 
|  | virtual ~Provider() = default; | 
|  |  | 
|  | // Whether the file tracing category is currently enabled. | 
|  | virtual bool FileTracingCategoryIsEnabled() const = 0; | 
|  |  | 
|  | // Enables file tracing for |id|. Must be called before recording events. | 
|  | virtual void FileTracingEnable(void* id) = 0; | 
|  |  | 
|  | // Disables file tracing for |id|. | 
|  | virtual void FileTracingDisable(void* id) = 0; | 
|  |  | 
|  | // Begins an event for |id| with |name|. |path| tells where in the directory | 
|  | // structure the event is happening (and may be blank). |size| is the number | 
|  | // of bytes involved in the event. | 
|  | virtual void FileTracingEventBegin(const char* name, | 
|  | void* id, | 
|  | const FilePath& path, | 
|  | int64_t size) = 0; | 
|  |  | 
|  | // Ends an event for |id| with |name|. | 
|  | virtual void FileTracingEventEnd(const char* name, void* id) = 0; | 
|  | }; | 
|  |  | 
|  | // Sets a global file tracing provider to query categories and record events. | 
|  | static void SetProvider(Provider* provider); | 
|  |  | 
|  | // Enables file tracing while in scope. | 
|  | class ScopedEnabler { | 
|  | public: | 
|  | ScopedEnabler(); | 
|  | ~ScopedEnabler(); | 
|  | }; | 
|  |  | 
|  | class ScopedTrace { | 
|  | public: | 
|  | ScopedTrace(); | 
|  | ~ScopedTrace(); | 
|  |  | 
|  | // Called only if the tracing category is enabled. |name| is the name of the | 
|  | // event to trace (e.g. "Read", "Write") and must have an application | 
|  | // lifetime (e.g. static or literal). |file| is the file being traced; must | 
|  | // outlive this class. |size| is the size (in bytes) of this event. | 
|  | void Initialize(const char* name, File* file, int64_t size); | 
|  |  | 
|  | private: | 
|  | // The ID of this trace. Based on the |file| passed to |Initialize()|. Must | 
|  | // outlive this class. | 
|  | void* id_; | 
|  |  | 
|  | // The name of the event to trace (e.g. "Read", "Write"). Prefixed with | 
|  | // "File". | 
|  | const char* name_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ScopedTrace); | 
|  | }; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(FileTracing); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_FILES_FILE_TRACING_H_ |