Step over thread plans were claiming to explain the fork stop reasons, which prevented the default fork logic (detaching from the child process) from kicking in. This patch changes that. Differential Revision: https://reviews.llvm.org/D141605
30 lines
787 B
C++
30 lines
787 B
C++
#include <cassert>
|
|
#include <chrono>
|
|
#include <cstdlib>
|
|
#include <sys/wait.h>
|
|
#include <thread>
|
|
#include <unistd.h>
|
|
|
|
int main() {
|
|
pid_t fork_result = fork(); // break here
|
|
assert(fork_result >= 0);
|
|
if (fork_result == 0) {
|
|
// child
|
|
_exit(47);
|
|
}
|
|
// parent
|
|
// Use polling to avoid blocking if the child is not actually resumed.
|
|
auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10);
|
|
std::chrono::milliseconds poll_interval{10};
|
|
while (std::chrono::steady_clock::now() < deadline) {
|
|
int status;
|
|
pid_t waitpid_result = waitpid(fork_result, &status, WNOHANG);
|
|
if (waitpid_result == fork_result)
|
|
return 0;
|
|
assert(waitpid_result == 0);
|
|
std::this_thread::sleep_for(poll_interval);
|
|
poll_interval *= 2;
|
|
}
|
|
abort();
|
|
}
|