PageRenderTime 27ms CodeModel.GetById 12ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 1ms

/thirdparty/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc

http://github.com/tomahawk-player/tomahawk
C++ | 89 lines | 51 code | 5 blank | 33 comment | 6 complexity | 5ea3c8ee844c9d0eda5366ccf93bd115 MD5 | raw file
 1// Copyright (c) 2010, Google Inc.
 2// All rights reserved.
 3//
 4// Redistribution and use in source and binary forms, with or without
 5// modification, are permitted provided that the following conditions are
 6// met:
 7//
 8//     * Redistributions of source code must retain the above copyright
 9// notice, this list of conditions and the following disclaimer.
10//     * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14//     * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Helper program for the linux_dumper class, which creates a bunch of
31// threads. The first word of each thread's stack is set to the thread
32// id.
33
34#include <pthread.h>
35#include <stdint.h>
36#include <stdio.h>
37#include <stdlib.h>
38#include <sys/syscall.h>
39#include <unistd.h>
40
41#include "third_party/lss/linux_syscall_support.h"
42
43#if defined(__ARM_EABI__)
44#define TID_PTR_REGISTER "r3"
45#elif defined(__i386)
46#define TID_PTR_REGISTER "ecx"
47#elif defined(__x86_64)
48#define TID_PTR_REGISTER "rcx"
49#else
50#error This test has not been ported to this platform.
51#endif
52
53void *thread_function(void *data) {
54  int pipefd = *static_cast<int *>(data);
55  volatile pid_t thread_id = syscall(__NR_gettid);
56  // Signal parent that a thread has started.
57  uint8_t byte = 1;
58  if (write(pipefd, &byte, sizeof(byte)) != sizeof(byte)) {
59    perror("ERROR: parent notification failed");
60    return NULL;
61  }
62  register volatile pid_t *thread_id_ptr asm(TID_PTR_REGISTER) = &thread_id;
63  while (true)
64    asm volatile ("" : : "r" (thread_id_ptr));
65  return NULL;
66}
67
68int main(int argc, char *argv[]) {
69  if (argc < 3) {
70    fprintf(stderr,
71            "usage: linux_dumper_unittest_helper <pipe fd> <# of threads>\n");
72    return 1;
73  }
74  int pipefd = atoi(argv[1]);
75  int num_threads = atoi(argv[2]);
76  if (num_threads < 1) {
77    fprintf(stderr, "ERROR: number of threads is 0");
78    return 1;
79  }
80  pthread_t threads[num_threads];
81  pthread_attr_t thread_attributes;
82  pthread_attr_init(&thread_attributes);
83  pthread_attr_setdetachstate(&thread_attributes, PTHREAD_CREATE_DETACHED);
84  for (int i = 1; i < num_threads; i++) {
85    pthread_create(&threads[i], &thread_attributes, &thread_function, &pipefd);
86  }
87  thread_function(&pipefd);
88  return 0;
89}