Fix Breakpad unit tests build for Android.

This patch contains the source-related fixes to ensure that
the Breakpad unit tests build properly when targetting Android.

Calling 'make check' still fails because there is still no
way to run the unit test programs on a device. This will be
addressed by a future patch.

Important notes:

- You must target Android API level 9 (Gingerbread) or higher
  to build the unit tests. This requirement is due to the
  current GTest revision used in the breakpad source tree.

- This patch adds headers providing inlined C library functions
  missing from the NDK (see src/common/android/testing). They
  are inlined to avoid modifying Makefile.am and other build
  files.

- Similarly, the <wchar.h> header-fix under
  src/common/android/testing/include is only required by
  GTest's current revision. E.g. it's not needed when building
  Breakpad as part of Chromium which uses a more up-to-date
  revision.
Review URL: https://breakpad.appspot.com/439002

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1020 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
digit@chromium.org 2012-08-23 15:45:01 +00:00
parent b8bb0326a8
commit 13d9e27ef0
9 changed files with 328 additions and 26 deletions

View file

@ -32,14 +32,20 @@
# This allows #includes to be relative to src/ # This allows #includes to be relative to src/
AM_CPPFLAGS = -I$(top_srcdir)/src AM_CPPFLAGS = -I$(top_srcdir)/src
AM_CXXFLAGS =
if ANDROID_HOST if ANDROID_HOST
# This allows using fixed NDK headers when building for Android. # This allows using fixed NDK headers when building for Android.
AM_CPPFLAGS += -I$(top_srcdir)/src/common/android/include AM_CXXFLAGS += -I$(top_srcdir)/src/common/android/include
# This is only necessary for building the unit tests until GTest is upgraded
# to a future version.
AM_CXXFLAGS += -I$(top_srcdir)/src/common/android/testing/include
endif endif
if GCC if GCC
# These are good warnings to be treated as errors # These are good warnings to be treated as errors
AM_CXXFLAGS = \ AM_CXXFLAGS += \
-Werror=non-virtual-dtor \ -Werror=non-virtual-dtor \
-Werror=vla \ -Werror=vla \
-Werror=unused-variable \ -Werror=unused-variable \
@ -351,6 +357,10 @@ src_client_linux_linux_client_unittest_LDADD = \
src/common/linux/safe_readlink.o \ src/common/linux/safe_readlink.o \
src/common/string_conversion.o \ src/common/string_conversion.o \
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
if ANDROID_HOST
src_client_linux_linux_client_unittest_LDFLAGS = \
-llog
endif
src_client_linux_linux_client_unittest_DEPENDENCIES = \ src_client_linux_linux_client_unittest_DEPENDENCIES = \
src/client/linux/linux_dumper_unittest_helper \ src/client/linux/linux_dumper_unittest_helper \

View file

@ -66,29 +66,43 @@ PRE_UNINSTALL = :
POST_UNINSTALL = : POST_UNINSTALL = :
build_triplet = @build@ build_triplet = @build@
host_triplet = @host@ host_triplet = @host@
# This allows using fixed NDK headers when building for Android. # This allows using fixed NDK headers when building for Android.
@ANDROID_HOST_TRUE@am__append_1 = -I$(top_srcdir)/src/common/android/include # This is only necessary for building the unit tests until GTest is upgraded
# to a future version.
@ANDROID_HOST_TRUE@am__append_1 = \
@ANDROID_HOST_TRUE@ -I$(top_srcdir)/src/common/android/include \
@ANDROID_HOST_TRUE@ -I$(top_srcdir)/src/common/android/testing/include
# These are good warnings to be treated as errors
@GCC_TRUE@am__append_2 = \
@GCC_TRUE@ -Werror=non-virtual-dtor \
@GCC_TRUE@ -Werror=vla \
@GCC_TRUE@ -Werror=unused-variable \
@GCC_TRUE@ -Werror=missing-braces \
@GCC_TRUE@ -Werror=overloaded-virtual
bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
$(am__EXEEXT_7) $(am__EXEEXT_7)
@DISABLE_PROCESSOR_FALSE@am__append_2 = src/libbreakpad.a @DISABLE_PROCESSOR_FALSE@am__append_3 = src/libbreakpad.a
@DISABLE_PROCESSOR_FALSE@am__append_3 = src/third_party/libdisasm/libdisasm.a @DISABLE_PROCESSOR_FALSE@am__append_4 = src/third_party/libdisasm/libdisasm.a
@LINUX_HOST_TRUE@am__append_4 = src/client/linux/libbreakpad_client.a @LINUX_HOST_TRUE@am__append_5 = src/client/linux/libbreakpad_client.a
@DISABLE_PROCESSOR_FALSE@am__append_5 = \ @DISABLE_PROCESSOR_FALSE@am__append_6 = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk
@LINUX_HOST_TRUE@am__append_6 = \ @LINUX_HOST_TRUE@am__append_7 = \
@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper @LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_7 = \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_8 = \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload
@DISABLE_PROCESSOR_FALSE@am__append_8 = \ @DISABLE_PROCESSOR_FALSE@am__append_9 = \
@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest \ @DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/address_map_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/address_map_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/binarystream_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/binarystream_unittest \
@ -113,14 +127,14 @@ check_PROGRAMS = $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest \
@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest @DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest
@LINUX_HOST_TRUE@am__append_9 = \ @LINUX_HOST_TRUE@am__append_10 = \
@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest @LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_10 = \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_11 = \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest
@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__append_11 = \ @DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__append_12 = \
@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@ src/processor/stackwalker_selftest @DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@ src/processor/stackwalker_selftest
noinst_PROGRAMS = noinst_PROGRAMS =
@ -433,6 +447,9 @@ am__src_client_linux_linux_client_unittest_SOURCES_DIST = \
src_client_linux_linux_client_unittest_OBJECTS = \ src_client_linux_linux_client_unittest_OBJECTS = \
$(am_src_client_linux_linux_client_unittest_OBJECTS) $(am_src_client_linux_linux_client_unittest_OBJECTS)
am__DEPENDENCIES_1 = am__DEPENDENCIES_1 =
src_client_linux_linux_client_unittest_LINK = $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(src_client_linux_linux_client_unittest_LDFLAGS) \
$(LDFLAGS) -o $@
am__src_client_linux_linux_dumper_unittest_helper_SOURCES_DIST = src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc am__src_client_linux_linux_dumper_unittest_helper_SOURCES_DIST = src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
@LINUX_HOST_TRUE@am_src_client_linux_linux_dumper_unittest_helper_OBJECTS = src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT) @LINUX_HOST_TRUE@am_src_client_linux_linux_dumper_unittest_helper_OBJECTS = src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT)
src_client_linux_linux_dumper_unittest_helper_OBJECTS = \ src_client_linux_linux_dumper_unittest_helper_OBJECTS = \
@ -1217,16 +1234,8 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
# This allows #includes to be relative to src/ # This allows #includes to be relative to src/
AM_CPPFLAGS = -I$(top_srcdir)/src $(am__append_1) AM_CPPFLAGS = -I$(top_srcdir)/src
AM_CXXFLAGS = $(am__append_1) $(am__append_2)
# These are good warnings to be treated as errors
@GCC_TRUE@AM_CXXFLAGS = \
@GCC_TRUE@ -Werror=non-virtual-dtor \
@GCC_TRUE@ -Werror=vla \
@GCC_TRUE@ -Werror=unused-variable \
@GCC_TRUE@ -Werror=missing-braces \
@GCC_TRUE@ -Werror=overloaded-virtual
# Specify include paths for ac macros # Specify include paths for ac macros
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
@ -1238,8 +1247,8 @@ dist_doc_DATA = \
NEWS \ NEWS \
README README
noinst_LIBRARIES = $(am__append_3) noinst_LIBRARIES = $(am__append_4)
lib_LIBRARIES = $(am__append_2) $(am__append_4) lib_LIBRARIES = $(am__append_3) $(am__append_5)
@LINUX_HOST_TRUE@src_client_linux_libbreakpad_client_a_SOURCES = \ @LINUX_HOST_TRUE@src_client_linux_libbreakpad_client_a_SOURCES = \
@LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_client.cc \ @LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_client.cc \
@LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.cc \ @LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.cc \
@ -1443,6 +1452,9 @@ TESTS_ENVIRONMENT =
@LINUX_HOST_TRUE@ src/common/string_conversion.o \ @LINUX_HOST_TRUE@ src/common/string_conversion.o \
@LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) @LINUX_HOST_TRUE@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_LDFLAGS = \
@ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@ -llog
@LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_DEPENDENCIES = \ @LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_DEPENDENCIES = \
@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ @LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \
@LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \ @LINUX_HOST_TRUE@ src/client/linux/libbreakpad_client.a \
@ -2576,7 +2588,7 @@ src/processor/src_client_linux_linux_client_unittest-pathname_stripper.$(OBJEXT)
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp) src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp)
@rm -f src/client/linux/linux_client_unittest$(EXEEXT) @rm -f src/client/linux/linux_client_unittest$(EXEEXT)
$(CXXLINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS) $(src_client_linux_linux_client_unittest_LINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS)
src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT): \ src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT): \
src/client/linux/minidump_writer/$(am__dirstamp) \ src/client/linux/minidump_writer/$(am__dirstamp) \
src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp)

View file

@ -0,0 +1,72 @@
// Copyright (c) 2012, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Android doesn't provide wcscasecmp(), so provide an alternative here.
//
// Note that this header is not needed when Breakpad is compiled against
// a recent version of Googletest. It shall be considered for removal once
// src/testing/ is updated to an appropriate revision in the future.
#ifndef GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H
#define GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H
#include_next <wchar.h>
// This needs to be in an extern "C" namespace, or Googletest will not
// compile against it.
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
static wchar_t inline wcstolower(wchar_t ch) {
if (ch >= L'a' && ch <= L'A')
ch -= L'a' - L'A';
return ch;
}
static int inline wcscasecmp(const wchar_t* s1, const wchar_t* s2) {
for (;;) {
wchar_t c1 = wcstolower(*s1);
wchar_t c2 = wcstolower(*s2);
if (c1 < c2)
return -1;
if (c1 > c2)
return 1;
if (c1 == L'0')
return 0;
s1++;
s2++;
}
}
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H

View file

@ -0,0 +1,103 @@
// Copyright (c) 2012, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Android doesn't provide mkdtemp(). Keep this implementation in an
// C++ anonymous namespace to avoid conflicts on Chromium (which
// already provides an extern "C" mkdtemp function).
//
// The reason this is inlined here is to avoid linking a new object file
// into each unit test program (i.e. keep build files simple).
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H
#define GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
namespace {
char* mkdtemp(char* path) {
if (path == NULL) {
errno = EINVAL;
return NULL;
}
// 'path' must be terminated with six 'X'
const char kSuffix[] = "XXXXXX";
const size_t kSuffixLen = strlen(kSuffix);
char* path_end = path + strlen(path);
if (path_end - path < kSuffixLen ||
memcmp(path_end - kSuffixLen, kSuffix, kSuffixLen) != 0) {
errno = EINVAL;
return NULL;
}
// If 'path' contains a directory separator, check that it exists to
// avoid looping later.
char* sep = strrchr(path, '/');
if (sep != NULL) {
struct stat st;
int ret;
*sep = '\0'; // temporarily zero-terminate the dirname.
ret = stat(path, &st);
*sep = '/'; // restore full path.
if (ret < 0)
return NULL;
if (!S_ISDIR(st.st_mode)) {
errno = ENOTDIR;
return NULL;
}
}
// Loop. On each iteration, replace the XXXXXX suffix with a random
// number.
int tries;
for (tries = 128; tries > 0; tries--) {
int random = rand() % 1000000;
snprintf(path_end - kSuffixLen, kSuffixLen + 1, "%0d", random);
if (mkdir(path, 0700) == 0)
return path; // Success
if (errno != EEXIST)
return NULL;
}
assert(errno == EEXIST);
return NULL;
}
} // namespace
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H

View file

@ -0,0 +1,98 @@
// Copyright (c) 2012, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// This contains Pthread-related functions not provided by the Android NDK
// but required by the Breakpad unit test. The functions are inlined here
// in a C++ anonymous namespace in order to keep the build files simples.
#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H
#define GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H
#include <pthread.h>
namespace {
// Android doesn't provide pthread_barrier_t for now.
#ifndef PTHREAD_BARRIER_SERIAL_THREAD
// Anything except 0 will do here.
#define PTHREAD_BARRIER_SERIAL_THREAD 0x12345
typedef struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
unsigned count;
} pthread_barrier_t;
int pthread_barrier_init(pthread_barrier_t* barrier,
const void* /* barrier_attr */,
unsigned count) {
barrier->count = count;
pthread_mutex_init(&barrier->mutex, NULL);
pthread_cond_init(&barrier->cond, NULL);
return 0;
}
int pthread_barrier_wait(pthread_barrier_t* barrier) {
// Lock the mutex
pthread_mutex_lock(&barrier->mutex);
// Decrement the count. If this is the first thread to reach 0, wake up
// waiters, unlock the mutex, then return PTHREAD_BARRIER_SERIAL_THREAD.
if (--barrier->count == 0) {
// First thread to reach the barrier
pthread_cond_broadcast(&barrier->cond);
pthread_mutex_unlock(&barrier->mutex);
return PTHREAD_BARRIER_SERIAL_THREAD;
}
// Otherwise, wait for other threads until the count reaches 0, then
// return 0 to indicate this is not the first thread.
do {
pthread_cond_wait(&barrier->cond, &barrier->mutex);
} while (barrier->count > 0);
pthread_mutex_unlock(&barrier->mutex);
return 0;
}
int pthread_barrier_destroy(pthread_barrier_t *barrier) {
barrier->count = 0;
pthread_cond_destroy(&barrier->cond);
pthread_mutex_destroy(&barrier->mutex);
}
#endif // defined(PTHREAD_BARRIER_SERIAL_THREAD)
int pthread_yield(void) {
sched_yield();
return 0;
}
} // namespace
#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H

View file

@ -182,7 +182,9 @@ TEST(ElfCoreDumpTest, ValidCoreFile) {
size_t num_nt_prpsinfo = 0; size_t num_nt_prpsinfo = 0;
size_t num_nt_prstatus = 0; size_t num_nt_prstatus = 0;
#if defined(__i386__) || defined(__x86_64__)
size_t num_nt_fpregset = 0; size_t num_nt_fpregset = 0;
#endif
#if defined(__i386__) #if defined(__i386__)
size_t num_nt_prxfpreg = 0; size_t num_nt_prxfpreg = 0;
#endif #endif

View file

@ -43,6 +43,9 @@
#include <string> #include <string>
#if defined(__ANDROID__)
#include "common/android/testing/pthread_fixes.h"
#endif
#include "common/linux/eintr_wrapper.h" #include "common/linux/eintr_wrapper.h"
#include "common/tests/auto_tempdir.h" #include "common/tests/auto_tempdir.h"
#include "common/tests/file_utils.h" #include "common/tests/file_utils.h"

View file

@ -44,6 +44,7 @@
#define TEMPDIR "/tmp" #define TEMPDIR "/tmp"
#else #else
#define TEMPDIR "/data/local/tmp" #define TEMPDIR "/data/local/tmp"
#include "common/android/testing/mkdtemp.h"
#endif #endif
namespace google_breakpad { namespace google_breakpad {

View file

@ -33,6 +33,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include "common/linux/eintr_wrapper.h" #include "common/linux/eintr_wrapper.h"