Merge "Fix hang after end of backup"

This commit is contained in:
Mike Lockwood 2011-06-21 16:44:32 -07:00 committed by Android (Google) Code Review
commit 693e78b9b6
1 changed files with 17 additions and 4 deletions

View File

@ -22,6 +22,11 @@
#define TRACE_TAG TRACE_ADB
#include "adb.h"
typedef struct {
pid_t pid;
int fd;
} backup_harvest_params;
// socketpair but do *not* mark as close_on_exec
static int backup_socketpair(int sv[2]) {
int rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
@ -31,11 +36,14 @@ static int backup_socketpair(int sv[2]) {
return 0;
}
static void* backup_child_waiter(void* pid_cookie) {
// harvest the child process then close the read end of the socketpair
static void* backup_child_waiter(void* args) {
int status;
backup_harvest_params* params = (backup_harvest_params*) args;
waitpid((pid_t) pid_cookie, &status, 0);
D("harvested backup/restore child, status=%d\n", status);
waitpid(params->pid, &status, 0);
adb_close(params->fd);
free(params);
return NULL;
}
@ -124,14 +132,19 @@ int backup_service(BackupOperation op, char* args) {
exit(-1);
} else {
adb_thread_t t;
backup_harvest_params* params;
// parent, i.e. adbd -- close the sending half of the socket
D("fork() returned pid %d\n", pid);
adb_close(s[1]);
// spin a thread to harvest the child process
if (adb_thread_create(&t, backup_child_waiter, (void*)pid)) {
params = (backup_harvest_params*) malloc(sizeof(backup_harvest_params));
params->pid = pid;
params->fd = s[0];
if (adb_thread_create(&t, backup_child_waiter, params)) {
adb_close(s[0]);
free(params);
D("Unable to create child harvester\n");
return -1;
}