Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / child / child_process.h
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
58   // webkit_glue::GetCookies.
59   base::WaitableEvent* GetShutDownEvent();
60
61   // These are used for ref-counting the child process.  The process shuts
62   // itself down when the ref count reaches 0.
63   // For example, in the renderer process, generally each tab managed by this
64   // process will hold a reference to the process, and release when closed.
65   void AddRefProcess();
66   void ReleaseProcess();
67
68   // Getter for the one ChildProcess object for this process. Can only be called
69   // on the main thread.
70   static ChildProcess* current();
71
72   static void WaitForDebugger(const std::string& label);
73  private:
74   int ref_count_;
75
76   // An event that will be signalled when we shutdown.
77   base::WaitableEvent shutdown_event_;
78
79   // The thread that handles IO events.
80   base::Thread io_thread_;
81
82   // NOTE: make sure that main_thread_ is listed after shutdown_event_, since
83   // it depends on it (indirectly through IPC::SyncChannel).  Same for
84   // io_thread_.
85   scoped_ptr<ChildThread> main_thread_;
86
87   DISALLOW_COPY_AND_ASSIGN(ChildProcess);
88 };
89
90 }  // namespace content
91
92 #endif  // CONTENT_CHILD_CHILD_PROCESS_H_