OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 base::ScopedFD pipe_c2p_read; // child to parent | 46 base::ScopedFD pipe_c2p_read; // child to parent |
47 base::ScopedFD pipe_c2p_write; // child to parent | 47 base::ScopedFD pipe_c2p_write; // child to parent |
48 base::ScopedFD pipe_p2c_read; // parent to child | 48 base::ScopedFD pipe_p2c_read; // parent to child |
49 base::ScopedFD pipe_p2c_write; // parent to child | 49 base::ScopedFD pipe_p2c_write; // parent to child |
50 pid_t child_pid; // valid only in parent | 50 pid_t child_pid; // valid only in parent |
51 }; | 51 }; |
52 | 52 |
53 } // namespace internal | 53 } // namespace internal |
54 | 54 |
55 Multiprocess::Multiprocess() | 55 Multiprocess::Multiprocess() |
56 : info_(NULL), | 56 : info_(nullptr), |
57 code_(EXIT_SUCCESS), | 57 code_(EXIT_SUCCESS), |
58 reason_(kTerminationNormal) { | 58 reason_(kTerminationNormal) { |
59 } | 59 } |
60 | 60 |
61 void Multiprocess::Run() { | 61 void Multiprocess::Run() { |
62 ASSERT_EQ(NULL, info_); | 62 ASSERT_EQ(nullptr, info_); |
63 scoped_ptr<internal::MultiprocessInfo> info(new internal::MultiprocessInfo); | 63 scoped_ptr<internal::MultiprocessInfo> info(new internal::MultiprocessInfo); |
64 base::AutoReset<internal::MultiprocessInfo*> reset_info(&info_, info.get()); | 64 base::AutoReset<internal::MultiprocessInfo*> reset_info(&info_, info.get()); |
65 | 65 |
66 ASSERT_NO_FATAL_FAILURE(PreFork()); | 66 ASSERT_NO_FATAL_FAILURE(PreFork()); |
67 | 67 |
68 pid_t pid = fork(); | 68 pid_t pid = fork(); |
69 ASSERT_GE(pid, 0) << ErrnoMessage("fork"); | 69 ASSERT_GE(pid, 0) << ErrnoMessage("fork"); |
70 | 70 |
71 if (pid > 0) { | 71 if (pid > 0) { |
72 info_->child_pid = pid; | 72 info_->child_pid = pid; |
73 | 73 |
74 RunParent(); | 74 RunParent(); |
75 | 75 |
76 // Waiting for the child happens here instead of in RunParent() because even | 76 // Waiting for the child happens here instead of in RunParent() because even |
77 // if RunParent() returns early due to a gtest fatal assertion failure, the | 77 // if RunParent() returns early due to a gtest fatal assertion failure, the |
78 // child should still be reaped. | 78 // child should still be reaped. |
79 | 79 |
80 // This will make the parent hang up on the child as much as would be | 80 // This will make the parent hang up on the child as much as would be |
81 // visible from the child’s perspective. The child’s side of the pipe will | 81 // visible from the child’s perspective. The child’s side of the pipe will |
82 // be broken, the child’s remote port will become a dead name, and an | 82 // be broken, the child’s remote port will become a dead name, and an |
83 // attempt by the child to look up the service will fail. If this weren’t | 83 // attempt by the child to look up the service will fail. If this weren’t |
84 // done, the child might hang while waiting for a parent that has already | 84 // done, the child might hang while waiting for a parent that has already |
85 // triggered a fatal assertion failure to do something. | 85 // triggered a fatal assertion failure to do something. |
86 info.reset(); | 86 info.reset(); |
87 info_ = NULL; | 87 info_ = nullptr; |
88 | 88 |
89 int status; | 89 int status; |
90 pid_t wait_pid = HANDLE_EINTR(waitpid(pid, &status, 0)); | 90 pid_t wait_pid = HANDLE_EINTR(waitpid(pid, &status, 0)); |
91 ASSERT_EQ(pid, wait_pid) << ErrnoMessage("waitpid"); | 91 ASSERT_EQ(pid, wait_pid) << ErrnoMessage("waitpid"); |
92 | 92 |
93 TerminationReason reason; | 93 TerminationReason reason; |
94 int code; | 94 int code; |
95 std::string message; | 95 std::string message; |
96 if (WIFEXITED(status)) { | 96 if (WIFEXITED(status)) { |
97 reason = kTerminationNormal; | 97 reason = kTerminationNormal; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 if (testing::Test::HasFailure()) { | 209 if (testing::Test::HasFailure()) { |
210 // Trigger the ScopedForbidReturn destructor. | 210 // Trigger the ScopedForbidReturn destructor. |
211 return; | 211 return; |
212 } | 212 } |
213 | 213 |
214 exit(0); | 214 exit(0); |
215 } | 215 } |
216 | 216 |
217 } // namespace test | 217 } // namespace test |
218 } // namespace crashpad | 218 } // namespace crashpad |
OLD | NEW |