Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Unified Diff: chrome_frame/chrome_frame_reporting.h

Issue 12521002: Start and stop crash reporting outside of the loader lock. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome_frame/chrome_frame_reporting.cc » ('j') | chrome_frame/chrome_tab.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome_frame/chrome_frame_reporting.h
diff --git a/chrome_frame/chrome_frame_reporting.h b/chrome_frame/chrome_frame_reporting.h
index 94bfbdc8a3fd02a5e75d6ed44613bf87102e8f7f..2c2f86645bbdb190ab2ca2ae0cb1466bf022916d 100644
--- a/chrome_frame/chrome_frame_reporting.h
+++ b/chrome_frame/chrome_frame_reporting.h
@@ -8,16 +8,71 @@
#ifndef CHROME_FRAME_CHROME_FRAME_REPORTING_H_
#define CHROME_FRAME_CHROME_FRAME_REPORTING_H_
-#include "chrome_frame/crash_reporting/crash_report.h"
+#include "base/basictypes.h"
+#include "base/synchronization/lock.h"
-extern const wchar_t kSystemPrincipalSid[];
+namespace base {
+template<typename Type> struct DefaultLazyInstanceTraits;
+}
-// Intialize crash reporting for Chrome Frame. Specific parameters here include
-// using the temp directory for dumps, determining if the install is system
-// wide or user specific, and customized client info.
-bool InitializeCrashReporting();
+class ScopedCrashReporting;
-// Shut down crash reporting for Chrome Frame.
-bool ShutdownCrashReporting();
+// Manages crash reporting for the Chrome Frame dll. Crash reporting cannot be
+// reliably started or stopped when the loader lock is held, so DllMain cannot
+// be used to start/stop reporting. Rather, a global instance of this class is
+// used. Each entrypoint into the dll must create a ScopedCrashReporting
+// instance on the stack. Crash reporting is automatically started when the
+// first such scoper is created and will ordinarily be stopped when the last one
+// is destroyed. If any scoper's Commit method is invoked, crash reporting will
+// stay running even after all scopers have gone away. This is the case when
+// objects have been returned by DllGetClassObject. Crash reporting will
+// continue to run until Decommit is called.
+class CrashReportingManager {
+ public:
+ // Causes crash reporting to be shut down either immediately or when the last
+ // scoper is destroyed.
+ static void Decommit();
robertshield 2013/03/06 13:50:32 nit: it seems slightly odd to have the public Comm
+
+ private:
+ friend class ScopedCrashReporting;
+ friend struct base::DefaultLazyInstanceTraits<CrashReportingManager>;
+
+ CrashReportingManager();
+ ~CrashReportingManager();
+ static CrashReportingManager& Get();
+ void AddRef();
+ void Release();
+ void Commit();
+ void ShutdownIfNotCommittedAndUnreferenced();
+
+ base::Lock lock_;
+ uint32 ref_count_;
+ bool initialized_;
+ bool committed_;
+ DISALLOW_COPY_AND_ASSIGN(CrashReportingManager);
+};
+
+// A class intended to be instantiated on the stack within entrypoints into the
+// Chrome Frame dll. Crash reporting is initialized upon construction if it is
+// not already running, and shut down when the last instance is destroyed unless
+// any such instance has invoked Commit.
+class ScopedCrashReporting {
+ public:
+ ScopedCrashReporting() : manager_(CrashReportingManager::Get()) {
+ manager_.AddRef();
+ }
+ ~ScopedCrashReporting() {
+ manager_.Release();
+ }
+
+ // Causes crash reporting to outlive this and all other instances.
+ void Commit() {
+ manager_.Commit();
+ }
+
+ private:
+ CrashReportingManager& manager_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedCrashReporting);
+};
#endif // CHROME_FRAME_CHROME_FRAME_REPORTING_H_
« no previous file with comments | « no previous file | chrome_frame/chrome_frame_reporting.cc » ('j') | chrome_frame/chrome_tab.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698