1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/message_loop.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(USE_LINUX_BREAKPAD)
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <sys/types.h>
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass BreakpadInfo;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace base {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Thread;
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // defined(USE_LINUX_BREAKPAD)
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentemplate <typename T> struct DefaultSingletonTraits;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is the base class for singleton objects which crash dump renderers and
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// plugins on Linux. We perform the crash dump from the browser because it
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// allows us to be outside the sandbox.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// PluginCrashHandlerHostLinux and RendererCrashHandlerHostLinux are singletons
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that handle plugin and renderer crashes, respectively.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Processes signal that they need to be dumped by sending a datagram over a
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// UNIX domain socket. All processes of the same type share the client end of
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this socket which is installed in their descriptor table before exec.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CrashHandlerHostLinux : public MessageLoopForIO::Watcher,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              public MessageLoop::DestructionObserver {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the file descriptor which processes should be given in order to signal
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // crashes to the browser.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetDeathSignalSocket() const {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return process_socket_;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MessagePumbLibevent::Watcher impl:
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnFileCanWriteWithoutBlocking(int fd);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnFileCanReadWithoutBlocking(int fd);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // MessageLoop::DestructionObserver impl:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WillDestroyCurrentMessageLoop();
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(USE_LINUX_BREAKPAD)
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Whether we are shutting down or not.
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool IsShuttingDown() const;
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashHandlerHostLinux();
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~CrashHandlerHostLinux();
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_LINUX_BREAKPAD)
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Only called in concrete subclasses.
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitCrashUploaderThread();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string process_type_;
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_LINUX_BREAKPAD)
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This is here on purpose to make CrashHandlerHostLinux abstract.
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetProcessType() = 0;
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Do work on the FILE thread for OnFileCanReadWithoutBlocking().
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void WriteDumpFile(BreakpadInfo* info,
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     pid_t crashing_pid,
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     char* crash_context,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     int signal_fd);
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Continue OnFileCanReadWithoutBlocking()'s work on the IO thread.
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void QueueCrashDumpTask(BreakpadInfo* info, int signal_fd);
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int process_socket_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int browser_socket_;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_LINUX_BREAKPAD)
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoopForIO::FileDescriptorWatcher file_descriptor_watcher_;
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Thread> uploader_thread_;
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool shutting_down_;
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CrashHandlerHostLinux);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass GpuCrashHandlerHostLinux : public CrashHandlerHostLinux {
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns the singleton instance.
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static GpuCrashHandlerHostLinux* GetInstance();
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend struct DefaultSingletonTraits<GpuCrashHandlerHostLinux>;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GpuCrashHandlerHostLinux();
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~GpuCrashHandlerHostLinux();
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(USE_LINUX_BREAKPAD)
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetProcessType();
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(GpuCrashHandlerHostLinux);
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PluginCrashHandlerHostLinux : public CrashHandlerHostLinux {
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Returns the singleton instance.
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static PluginCrashHandlerHostLinux* GetInstance();
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend struct DefaultSingletonTraits<PluginCrashHandlerHostLinux>;
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PluginCrashHandlerHostLinux();
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~PluginCrashHandlerHostLinux();
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_LINUX_BREAKPAD)
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetProcessType();
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PluginCrashHandlerHostLinux);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RendererCrashHandlerHostLinux : public CrashHandlerHostLinux {
13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Returns the singleton instance.
13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static RendererCrashHandlerHostLinux* GetInstance();
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend struct DefaultSingletonTraits<RendererCrashHandlerHostLinux>;
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RendererCrashHandlerHostLinux();
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~RendererCrashHandlerHostLinux();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_LINUX_BREAKPAD)
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetProcessType();
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(RendererCrashHandlerHostLinux);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass PpapiCrashHandlerHostLinux : public CrashHandlerHostLinux {
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the singleton instance.
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static PpapiCrashHandlerHostLinux* GetInstance();
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend struct DefaultSingletonTraits<PpapiCrashHandlerHostLinux>;
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PpapiCrashHandlerHostLinux();
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~PpapiCrashHandlerHostLinux();
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(USE_LINUX_BREAKPAD)
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetProcessType();
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PpapiCrashHandlerHostLinux);
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
167