Merge "leak_test: use tgkill to check if threads are alive." am: 80d85f72dd

am: 6f844f936f

Change-Id: I2bad3d4a8fb251da87ee1d7a54c914244369dded
This commit is contained in:
Josh Gao 2019-08-13 19:00:41 -07:00 committed by android-build-merger
commit 1dbc20905a

View file

@ -17,6 +17,7 @@
#include <err.h>
#include <inttypes.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
@ -30,26 +31,28 @@
#include <vector>
#include <android-base/macros.h>
#include <android-base/threads.h>
#include "utils.h"
using namespace std::chrono_literals;
static void WaitUntilAllExited(pid_t* pids, size_t pid_count) {
static void WaitUntilAllThreadsExited(pid_t* tids, size_t tid_count) {
// Wait until all children have exited.
bool alive = true;
while (alive) {
alive = false;
for (size_t i = 0; i < pid_count; ++i) {
if (pids[i] != 0) {
if (kill(pids[i], 0) == 0) {
for (size_t i = 0; i < tid_count; ++i) {
if (tids[i] != 0) {
if (tgkill(getpid(), tids[i], 0) == 0) {
alive = true;
} else {
EXPECT_EQ(errno, ESRCH);
pids[i] = 0; // Skip in next loop.
tids[i] = 0; // Skip in next loop.
}
}
}
sched_yield();
}
}
@ -155,7 +158,7 @@ TEST(pthread_leak, detach) {
pthread_barrier_wait(&barrier);
ASSERT_EQ(pthread_barrier_destroy(&barrier), 0);
WaitUntilAllExited(tids, arraysize(tids));
WaitUntilAllThreadsExited(tids, threads_count);
// A native bridge implementation might need a warm up pass to reach a steady state.
// http://b/37920774.