[content shell] hook up testRunner.dumpEditingCallbacks
[chromium-blink-merge.git] / content / zygote / zygote_linux.h
bloba093855d2672098f0629850cf33bc21a7c549d75
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.
5 #ifndef CONTENT_ZYGOTE_ZYGOTE_H_
6 #define CONTENT_ZYGOTE_ZYGOTE_H_
8 #include <string>
9 #include <vector>
11 #include "base/hash_tables.h"
12 #include "base/process.h"
14 class Pickle;
15 class PickleIterator;
17 namespace content {
19 class ZygoteForkDelegate;
21 // This is the object which implements the zygote. The ZygoteMain function,
22 // which is called from ChromeMain, simply constructs one of these objects and
23 // runs it.
24 class Zygote {
25 public:
26 Zygote(int sandbox_flags,
27 ZygoteForkDelegate* helper);
28 ~Zygote();
30 bool ProcessRequests();
32 static const int kBrowserDescriptor = 3;
33 static const int kMagicSandboxIPCDescriptor = 5;
35 private:
36 // Returns true if the SUID sandbox is active.
37 bool UsingSUIDSandbox() const;
39 // ---------------------------------------------------------------------------
40 // Requests from the browser...
42 // Read and process a request from the browser. Returns true if we are in a
43 // new process and thus need to unwind back into ChromeMain.
44 bool HandleRequestFromBrowser(int fd);
46 void HandleReapRequest(int fd, const Pickle& pickle, PickleIterator iter);
48 void HandleGetTerminationStatus(int fd,
49 const Pickle& pickle,
50 PickleIterator iter);
52 // This is equivalent to fork(), except that, when using the SUID sandbox, it
53 // returns the real PID of the child process as it appears outside the
54 // sandbox, rather than returning the PID inside the sandbox. Optionally, it
55 // fills in uma_name et al with a report the helper wants to make via
56 // UMA_HISTOGRAM_ENUMERATION.
57 int ForkWithRealPid(const std::string& process_type,
58 std::vector<int>& fds,
59 const std::string& channel_switch,
60 std::string* uma_name,
61 int* uma_sample,
62 int* uma_boundary_value);
64 // Unpacks process type and arguments from |pickle| and forks a new process.
65 // Returns -1 on error, otherwise returns twice, returning 0 to the child
66 // process and the child process ID to the parent process, like fork().
67 base::ProcessId ReadArgsAndFork(const Pickle& pickle,
68 PickleIterator iter,
69 std::vector<int>& fds,
70 std::string* uma_name,
71 int* uma_sample,
72 int* uma_boundary_value);
74 // Handle a 'fork' request from the browser: this means that the browser
75 // wishes to start a new renderer. Returns true if we are in a new process,
76 // otherwise writes the child_pid back to the browser via |fd|. Writes a
77 // child_pid of -1 on error.
78 bool HandleForkRequest(int fd,
79 const Pickle& pickle,
80 PickleIterator iter,
81 std::vector<int>& fds);
83 bool HandleGetSandboxStatus(int fd,
84 const Pickle& pickle,
85 PickleIterator iter);
87 // In the SUID sandbox, we try to use a new PID namespace. Thus the PIDs
88 // fork() returns are not the real PIDs, so we need to map the Real PIDS
89 // into the sandbox PID namespace.
90 typedef base::hash_map<base::ProcessHandle, base::ProcessHandle> ProcessMap;
91 ProcessMap real_pids_to_sandbox_pids;
93 const int sandbox_flags_;
94 ZygoteForkDelegate* helper_;
96 // These might be set by helper_->InitialUMA. They supply a UMA enumeration
97 // sample we should report on the first fork.
98 std::string initial_uma_name_;
99 int initial_uma_sample_;
100 int initial_uma_boundary_value_;
103 } // namespace content
105 #endif // CONTENT_ZYGOTE_ZYGOTE_H_