OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ | 5 #ifndef CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ |
6 #define CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ | 6 #define CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ |
7 | 7 |
8 #include <time.h> | |
9 | |
10 #include <string> | |
11 | |
12 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
13 #include "base/macros.h" | 9 #include "base/macros.h" |
14 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
15 #include "base/values.h" | 11 #include "base/values.h" |
16 #include "chromecast/crash/linux/dump_info.h" | 12 #include "chromecast/crash/linux/dump_info.h" |
17 | 13 |
18 namespace chromecast { | 14 namespace chromecast { |
19 | 15 |
20 // Abstract base class for mutually-exclusive minidump handling. Ensures | 16 // Abstract base class for mutually-exclusive minidump handling. Ensures |
21 // synchronized access among instances of this class to the minidumps directory | 17 // synchronized access among instances of this class to the minidumps directory |
(...skipping 25 matching lines...) Expand all Loading... |
47 class SynchronizedMinidumpManager { | 43 class SynchronizedMinidumpManager { |
48 public: | 44 public: |
49 // Length of a ratelimit period in seconds. | 45 // Length of a ratelimit period in seconds. |
50 static const int kRatelimitPeriodSeconds; | 46 static const int kRatelimitPeriodSeconds; |
51 | 47 |
52 // Number of dumps allowed per period. | 48 // Number of dumps allowed per period. |
53 static const int kRatelimitPeriodMaxDumps; | 49 static const int kRatelimitPeriodMaxDumps; |
54 | 50 |
55 virtual ~SynchronizedMinidumpManager(); | 51 virtual ~SynchronizedMinidumpManager(); |
56 | 52 |
57 // Returns whether this object's file locking method is nonblocking or not. | |
58 bool non_blocking() { return non_blocking_; } | |
59 | |
60 // Sets the file locking mechansim to be nonblocking or not. | |
61 void set_non_blocking(bool non_blocking) { non_blocking_ = non_blocking; } | |
62 | |
63 protected: | 53 protected: |
64 SynchronizedMinidumpManager(); | 54 SynchronizedMinidumpManager(); |
65 | 55 |
66 // Acquires the lock, calls DoWork(), then releases the lock when DoWork() | 56 // Acquires the lock, calls DoWork(), then releases the lock when DoWork() |
67 // returns. Derived classes should expose a method which calls this. Returns | 57 // returns. Derived classes should expose a method which calls this. Returns |
68 // the status of DoWork(), or -1 if the lock was not successfully acquired. | 58 // the status of DoWork(), or false if the lock was not successfully acquired. |
69 int AcquireLockAndDoWork(); | 59 bool AcquireLockAndDoWork(); |
70 | 60 |
71 // Derived classes must implement this method. It will be called from | 61 // Derived classes must implement this method. It will be called from |
72 // DoWorkLocked after the lock has been successfully acquired. The lockfile | 62 // DoWorkLocked after the lock has been successfully acquired. The lockfile |
73 // shall be accessed and mutated only through the methods below. All other | 63 // shall be accessed and mutated only through the methods below. All other |
74 // files shall be managed as needed by the derived class. | 64 // files shall be managed as needed by the derived class. |
75 virtual int DoWork() = 0; | 65 virtual bool DoWork() = 0; |
76 | 66 |
77 // Get the current dumps in the lockfile. | 67 // Get the current dumps in the lockfile. |
78 ScopedVector<DumpInfo> GetDumps(); | 68 ScopedVector<DumpInfo> GetDumps(); |
79 | 69 |
80 // Set |dumps| as the dumps in |lockfile_|, replacing current list of dumps. | 70 // Set |dumps| as the dumps in |lockfile_|, replacing current list of dumps. |
81 int SetCurrentDumps(const ScopedVector<DumpInfo>& dumps); | 71 bool SetCurrentDumps(const ScopedVector<DumpInfo>& dumps); |
82 | 72 |
83 // Serialize |dump_info| and append it to the lockfile. Note that the child | 73 // Serialize |dump_info| and append it to the lockfile. Note that the child |
84 // class must only call this inside DoWork(). This should be the only method | 74 // class must only call this inside DoWork(). This should be the only method |
85 // used to write to the lockfile. Only call this if the minidump has been | 75 // used to write to the lockfile. Only call this if the minidump has been |
86 // generated in the minidumps directory successfully. Returns 0 on success, | 76 // generated in the minidumps directory successfully. Returns true on success, |
87 // -1 otherwise. | 77 // false otherwise. |
88 int AddEntryToLockFile(const DumpInfo& dump_info); | 78 bool AddEntryToLockFile(const DumpInfo& dump_info); |
89 | 79 |
90 // Remove the lockfile entry at |index| in the current in memory | 80 // Remove the lockfile entry at |index| in the current in memory |
91 // representation of the lockfile. If the index is invalid returns -1. | 81 // representation of the lockfile. If the index is invalid returns false, |
92 // Otherwise returns 0. | 82 // otherwise returns true. |
93 int RemoveEntryFromLockFile(int index); | 83 bool RemoveEntryFromLockFile(int index); |
94 | 84 |
95 // Get the number of un-uploaded dumps in the dump_path directory. | 85 // Get the number of un-uploaded dumps in the dump_path directory. |
96 // If delete_all_dumps is true, also delete all these files, this is used to | 86 // If delete_all_dumps is true, also delete all these files, this is used to |
97 // clean lingering dump files. | 87 // clean lingering dump files. |
98 int GetNumDumps(bool delete_all_dumps); | 88 int GetNumDumps(bool delete_all_dumps); |
99 | 89 |
100 // Increment the number of dumps in the current ratelimit period. | 90 // Increment the number of dumps in the current ratelimit period. |
101 // Returns 0 on success, < 0 on error. | 91 // Returns true on success, false on error. |
102 int IncrementNumDumpsInCurrentPeriod(); | 92 bool IncrementNumDumpsInCurrentPeriod(); |
103 | 93 |
104 // Returns true when dumps uploaded in current rate limit period is less than | 94 // Returns true when dumps uploaded in current rate limit period is less than |
105 // |kRatelimitPeriodMaxDumps|. Resets rate limit period if period time has | 95 // |kRatelimitPeriodMaxDumps|. Resets rate limit period if period time has |
106 // elapsed. | 96 // elapsed. |
107 bool CanUploadDump(); | 97 bool CanUploadDump(); |
108 | 98 |
109 // Returns true when there are dumps in the lockfile or extra files in the | 99 // Returns true when there are dumps in the lockfile or extra files in the |
110 // dump directory, false otherwise. | 100 // dump directory, false otherwise. |
111 // Used to avoid unnecessary file locks in consumers. | 101 // Used to avoid unnecessary file locks in consumers. |
112 bool HasDumps(); | 102 bool HasDumps(); |
113 | 103 |
114 // If true, the flock on the lockfile will be nonblocking. | |
115 bool non_blocking_; | |
116 | |
117 // Cached path for the minidumps directory. | 104 // Cached path for the minidumps directory. |
118 const base::FilePath dump_path_; | 105 const base::FilePath dump_path_; |
119 | 106 |
120 private: | 107 private: |
121 // Acquire the lock file. Blocks if another process holds it, or if called | 108 // Acquire the lock file. Blocks if another process holds it, or if called |
122 // a second time by the same process. Returns the fd of the lockfile if | 109 // a second time by the same process. Returns true if successful, or false |
123 // successful, or -1 if failed. | 110 // otherwise. |
124 int AcquireLockFile(); | 111 bool AcquireLockFile(); |
125 | 112 |
126 // Parse the lockfile and metadata file, populating |dumps_| and |metadata_| | 113 // Parse the lockfile and metadata file, populating |dumps_| and |metadata_| |
127 // for modifier functions to use. Return -1 if an error occurred. Otherwise, | 114 // for modifier functions to use. Returns false if an error occurred, |
128 // return 0. This must not be called unless |this| has acquired the lock. | 115 // otherwise returns true. This must not be called unless |this| has acquired |
129 int ParseFiles(); | 116 // the lock. |
| 117 bool ParseFiles(); |
130 | 118 |
131 // Write deserialized |dumps| to |lockfile_path_| and the deserialized | 119 // Write deserialized |dumps| to |lockfile_path_| and the deserialized |
132 // |metadata| to |metadata_path_|. | 120 // |metadata| to |metadata_path_|. |
133 int WriteFiles(const base::ListValue* dumps, const base::Value* metadata); | 121 bool WriteFiles(const base::ListValue* dumps, const base::Value* metadata); |
134 | 122 |
135 // Creates an empty lock file and an initialized metadata file. | 123 // Creates an empty lock file and an initialized metadata file. |
136 int InitializeFiles(); | 124 bool InitializeFiles(); |
137 | 125 |
138 // Release the lock file with the associated *fd*. | 126 // Release the lock file with the associated *fd*. |
139 void ReleaseLockFile(); | 127 void ReleaseLockFile(); |
140 | 128 |
141 const std::string lockfile_path_; | 129 const base::FilePath lockfile_path_; |
142 const std::string metadata_path_; | 130 const base::FilePath metadata_path_; |
143 int lockfile_fd_; | 131 int lockfile_fd_; |
144 std::unique_ptr<base::Value> metadata_; | 132 std::unique_ptr<base::Value> metadata_; |
145 std::unique_ptr<base::ListValue> dumps_; | 133 std::unique_ptr<base::ListValue> dumps_; |
146 | 134 |
147 DISALLOW_COPY_AND_ASSIGN(SynchronizedMinidumpManager); | 135 DISALLOW_COPY_AND_ASSIGN(SynchronizedMinidumpManager); |
148 }; | 136 }; |
149 | 137 |
150 } // namespace chromecast | 138 } // namespace chromecast |
151 | 139 |
152 #endif // CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ | 140 #endif // CHROMECAST_CRASH_LINUX_SYNCHRONIZED_MINIDUMP_MANAGER_H_ |
OLD | NEW |