Fix deadlocks.
1. Close pipe fds[1] as soon as possible. Otherwise it may block when reading from fds[0] even though the child process has exited early and closed its copy of fds[1]. 2. Waitpid after pipe is closed. Otherwise the screencap child process may block while writing fds[1], because the fds[0] is not closed yet. If we close fds[0] first, then the screencap child process will die because of SIGPIPE, and waitpid will return correctly. Change-Id: I433c95a5ba2eb3045727fc39a49fd9557fb1a1d1 Signed-off-by: Bao Haojun <baohaojun@gmail.com>
This commit is contained in:
parent
32e4479d55
commit
cdb1b1b84d
1 changed files with 3 additions and 3 deletions
|
@ -76,6 +76,7 @@ void framebuffer_service(int fd, void *cookie)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
close(fds[1]);
|
||||
fd_screencap = fds[0];
|
||||
|
||||
/* read w, h & format */
|
||||
|
@ -173,10 +174,9 @@ void framebuffer_service(int fd, void *cookie)
|
|||
}
|
||||
|
||||
done:
|
||||
TEMP_FAILURE_RETRY(waitpid(pid, NULL, 0));
|
||||
|
||||
close(fds[0]);
|
||||
close(fds[1]);
|
||||
|
||||
TEMP_FAILURE_RETRY(waitpid(pid, NULL, 0));
|
||||
pipefail:
|
||||
close(fd);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue