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