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