file_tracing.h revision b8cf94937c52feb53b55c39e3f82094d27de464c
1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright 2015 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_FILES_FILE_TRACING_H_ 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_FILES_FILE_TRACING_H_ 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h" 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/basictypes.h" 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/macros.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define FILE_TRACING_PREFIX "File" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define SCOPED_FILE_TRACE_WITH_SIZE(name, size) \ 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FileTracing::ScopedTrace scoped_file_trace; \ 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (scoped_file_trace.ShouldInitialize()) \ 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_file_trace.Initialize(FILE_TRACING_PREFIX "::" name, this, size) 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define SCOPED_FILE_TRACE(name) SCOPED_FILE_TRACE_WITH_SIZE(name, 0) 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass File; 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass FilePath; 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT FileTracing { 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat class Provider { 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Whether the file tracing category is currently enabled. 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual bool FileTracingCategoryIsEnabled() const = 0; 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Enables file tracing for |id|. Must be called before recording events. 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual void FileTracingEnable(void* id) = 0; 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Disables file tracing for |id|. 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual void FileTracingDisable(void* id) = 0; 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Begins an event for |id| with |name|. |path| tells where in the directory 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // structure the event is happening (and may be blank). |size| is the number 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // of bytes involved in the event. 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual void FileTracingEventBegin( 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, void* id, const FilePath& path, int64 size) = 0; 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Ends an event for |id| with |name|. 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat virtual void FileTracingEventEnd(const char* name, void* id) = 0; 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Sets a global file tracing provider to query categories and record events. 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static void SetProvider(Provider* provider); 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Enables file tracing while in scope. 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat class ScopedEnabler { 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ScopedEnabler(); 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ScopedEnabler(); 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat class ScopedTrace { 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ScopedTrace(); 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ScopedTrace(); 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Whether this trace should be initialized or not. 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool ShouldInitialize() const; 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Called only if the tracing category is enabled. |name| is the name of the 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // event to trace (e.g. "Read", "Write") and must have an application 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // lifetime (e.g. static or literal). |file| is the file being traced; must 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // outlive this class. |size| is the size (in bytes) of this event. 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Initialize(const char* name, File* file, int64 size); 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The ID of this trace. Based on the |file| passed to |Initialize()|. Must 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // outlive this class. 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void* id_; 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The name of the event to trace (e.g. "Read", "Write"). Prefixed with 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // "File". 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name_; 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(ScopedTrace); 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(FileTracing); 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_FILES_FILE_TRACING_H_ 91