12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -fsanitize-memory-track-origins -O0 %s -o %t && %run %t
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Regression test for a deadlock in pthread_getattr_np
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h>
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pthread.h>
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *ThreadFn(void *) {
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_attr_t attr;
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = pthread_getattr_np(pthread_self(), &attr);
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(!res);
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(void) {
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_t t;
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int res = pthread_create(&t, 0, ThreadFn, 0);
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(!res);
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  res = pthread_join(t, 0);
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(!res);
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
23