Home | History | Annotate | Download | only in child
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_CHILD_CHILD_PROCESS_H_
      6 #define CONTENT_CHILD_CHILD_PROCESS_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/synchronization/waitable_event.h"
     11 #include "base/threading/thread.h"
     12 #include "content/common/content_export.h"
     13 
     14 namespace content {
     15 class ChildThread;
     16 
     17 // Base class for child processes of the browser process (i.e. renderer and
     18 // plugin host). This is a singleton object for each child process.
     19 //
     20 // During process shutdown the following sequence of actions happens in
     21 // order.
     22 //
     23 // 1. ChildProcess::~ChildProcess() is called.
     24 //   2. Shutdown event is fired. Background threads should stop.
     25 //   3. ChildThread::Shutdown() is called. ChildThread is also deleted.
     26 //   4. IO thread is stopped.
     27 // 5. Main message loop exits.
     28 // 6. Child process is now fully stopped.
     29 //
     30 // Note: IO thread outlives the ChildThread object.
     31 class CONTENT_EXPORT ChildProcess {
     32  public:
     33   // Child processes should have an object that derives from this class.
     34   // Normally you would immediately call set_main_thread after construction.
     35   ChildProcess();
     36   virtual ~ChildProcess();
     37 
     38   // May be NULL if the main thread hasn't been set explicitly.
     39   ChildThread* main_thread();
     40 
     41   // Sets the object associated with the main thread of this process.
     42   // Takes ownership of the pointer.
     43   void set_main_thread(ChildThread* thread);
     44 
     45   base::MessageLoop* io_message_loop() { return io_thread_.message_loop(); }
     46   base::MessageLoopProxy* io_message_loop_proxy() {
     47     return io_thread_.message_loop_proxy().get();
     48   }
     49 
     50   // A global event object that is signalled when the main thread's message
     51   // loop exits.  This gives background threads a way to observe the main
     52   // thread shutting down.  This can be useful when a background thread is
     53   // waiting for some information from the browser process.  If the browser
     54   // process goes away prematurely, the background thread can at least notice
     55   // the child processes's main thread exiting to determine that it should give
     56   // up waiting.
     57   // For example, see the renderer code used to implement GetCookies().
     58   base::WaitableEvent* GetShutDownEvent();
     59 
     60   // These are used for ref-counting the child process.  The process shuts
     61   // itself down when the ref count reaches 0.
     62   // For example, in the renderer process, generally each tab managed by this
     63   // process will hold a reference to the process, and release when closed.
     64   void AddRefProcess();
     65   void ReleaseProcess();
     66 
     67   // Getter for the one ChildProcess object for this process. Can only be called
     68   // on the main thread.
     69   static ChildProcess* current();
     70 
     71   static void WaitForDebugger(const std::string& label);
     72  private:
     73   int ref_count_;
     74 
     75   // An event that will be signalled when we shutdown.
     76   base::WaitableEvent shutdown_event_;
     77 
     78   // The thread that handles IO events.
     79   base::Thread io_thread_;
     80 
     81   // NOTE: make sure that main_thread_ is listed after shutdown_event_, since
     82   // it depends on it (indirectly through IPC::SyncChannel).  Same for
     83   // io_thread_.
     84   scoped_ptr<ChildThread> main_thread_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(ChildProcess);
     87 };
     88 
     89 }  // namespace content
     90 
     91 #endif  // CONTENT_CHILD_CHILD_PROCESS_H_
     92