Index: content/browser/zygote_host/zygote_host_impl_linux.h |
diff --git a/content/browser/zygote_host/zygote_host_impl_linux.h b/content/browser/zygote_host/zygote_host_impl_linux.h |
index e640a990a6f2e992a9726c34874a3a7e7b55f8cd..6793f73757c8be61eaacd4db0c08cc480dc2e99d 100644 |
--- a/content/browser/zygote_host/zygote_host_impl_linux.h |
+++ b/content/browser/zygote_host/zygote_host_impl_linux.h |
@@ -5,13 +5,16 @@ |
#ifndef CONTENT_BROWSER_ZYGOTE_HOST_ZYGOTE_HOST_IMPL_LINUX_H_ |
#define CONTENT_BROWSER_ZYGOTE_HOST_ZYGOTE_HOST_IMPL_LINUX_H_ |
-#include <sys/types.h> |
+#include <stddef.h> |
#include <set> |
#include <string> |
+#include <vector> |
-#include "base/process/process_handle.h" |
+#include "base/pickle.h" |
+#include "base/process/kill.h" |
#include "base/synchronization/lock.h" |
+#include "content/public/browser/file_descriptor_info.h" |
#include "content/public/browser/zygote_host_linux.h" |
namespace base { |
@@ -28,17 +31,35 @@ |
void Init(const std::string& sandbox_cmd); |
- // Retrieves the sandbox command passed into Init(); |
- const std::string& SandboxCommand() const; |
+ // After the last known Zygote child exits, notify the Zygote to exit. |
+ void TearDownAfterLastChild(); |
- // Tells the ZygoteHost the PIDs of all the zygotes. |
- void AddZygotePid(pid_t pid); |
+ // Tries to start a process of type indicated by process_type. |
+ // Returns its pid on success, otherwise |
+ // base::kNullProcessHandle; |
+ pid_t ForkRequest(const std::vector<std::string>& command_line, |
+ scoped_ptr<FileDescriptorInfo> mapping, |
+ const std::string& process_type); |
+ void EnsureProcessTerminated(pid_t process); |
- // Returns whether or not this pid is the pid of a zygote. |
- bool IsZygotePid(pid_t pid) override; |
+ // Get the termination status (and, optionally, the exit code) of |
+ // the process. |exit_code| is set to the exit code of the child |
+ // process. (|exit_code| may be NULL.) |
+ // Unfortunately the Zygote can not accurately figure out if a process |
+ // is already dead without waiting synchronously for it. |
+ // |known_dead| should be set to true when we already know that the process |
+ // is dead. When |known_dead| is false, processes could be seen as |
+ // still running, even when they're not. When |known_dead| is true, the |
+ // process will be SIGKILL-ed first (which should have no effect if it was |
+ // really dead). This is to prevent a waiting waitpid() from blocking in |
+ // a single-threaded Zygote. See crbug.com/157458. |
+ base::TerminationStatus GetTerminationStatus(base::ProcessHandle handle, |
+ bool known_dead, |
+ int* exit_code); |
- void SetRendererSandboxStatus(int status); |
- int GetRendererSandboxStatus() const override; |
+ // ZygoteHost implementation: |
+ pid_t GetPid() const override; |
+ int GetSandboxStatus() const override; |
void AdjustRendererOOMScore(base::ProcessHandle process_handle, |
int score) override; |
@@ -48,13 +69,42 @@ |
ZygoteHostImpl(); |
~ZygoteHostImpl() override; |
- int renderer_sandbox_status_; |
+ // Notify the Zygote to exit immediately. This object should not be |
+ // used afterwards. |
+ void TearDown(); |
+ |
+ // Should be called every time a Zygote child is born. |
+ void ZygoteChildBorn(pid_t process); |
+ |
+ // Should be called every time a Zygote child died. |
+ void ZygoteChildDied(pid_t process); |
+ |
+ // Sends |data| to the zygote via |control_fd_|. If |fds| is non-NULL, the |
+ // included file descriptors will also be passed. The caller is responsible |
+ // for acquiring |control_lock_|. |
+ bool SendMessage(const base::Pickle& data, const std::vector<int>* fds); |
+ |
+ ssize_t ReadReply(void* buf, size_t buflen); |
+ |
+ // Whether we should use the namespace sandbox instead of the setuid sandbox. |
+ bool ShouldUseNamespaceSandbox(); |
+ |
+ int control_fd_; // the socket to the zygote |
+ // A lock protecting all communication with the zygote. This lock must be |
+ // acquired before sending a command and released after the result has been |
+ // received. |
+ base::Lock control_lock_; |
+ pid_t pid_; |
+ bool init_; |
bool use_suid_sandbox_for_adj_oom_score_; |
std::string sandbox_binary_; |
- // This lock protects the |zygote_pids_| set. |
- base::Lock zygote_pids_lock_; |
- // This is a set of PIDs representing all the running zygotes. |
- std::set<pid_t> zygote_pids_; |
+ bool have_read_sandbox_status_word_; |
+ int sandbox_status_; |
+ // A lock protecting list_of_running_zygote_children_ and |
+ // should_teardown_after_last_child_exits_. |
+ base::Lock child_tracking_lock_; |
+ std::set<pid_t> list_of_running_zygote_children_; |
+ bool should_teardown_after_last_child_exits_; |
}; |
} // namespace content |