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