summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_defs.h2
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_mman.h1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc9
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl.cc1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl.h6
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc4
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc14
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_trace.h2
-rw-r--r--compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc1
9 files changed, 19 insertions, 21 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_defs.h b/compiler-rt/lib/tsan/rtl/tsan_defs.h
index e9a801d2979..2cd205d4009 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_defs.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_defs.h
@@ -29,7 +29,7 @@ typedef signed long long s64; // NOLINT
typedef unsigned long uptr; // NOLINT
const uptr kPageSize = 4096;
-const int kTidBits = 15;
+const int kTidBits = 13;
const unsigned kMaxTid = 1 << kTidBits;
const unsigned kMaxTidInClock = kMaxTid * 2; // This includes msb 'freed' bit.
const int kClkBits = 40;
diff --git a/compiler-rt/lib/tsan/rtl/tsan_mman.h b/compiler-rt/lib/tsan/rtl/tsan_mman.h
index 8b51de6f350..b0f86c96b47 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_mman.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_mman.h
@@ -39,6 +39,7 @@ enum MBlockType {
MBlockSync,
MBlockClock,
MBlockThreadContex,
+ MBlockDeadInfo,
MBlockRacyStacks,
MBlockRacyAddresses,
MBlockAtExit,
diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc
index 8bb2b483c73..7b8be3dbf23 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc
@@ -241,13 +241,8 @@ void GetThreadStackAndTls(uptr *stk_addr, uptr *stk_size,
if (*tls_addr > *stk_addr && *tls_addr < *stk_addr + *stk_size) {
CHECK_GT(*tls_addr + *tls_size, *stk_addr);
CHECK_LE(*tls_addr + *tls_size, *stk_addr + *stk_size);
- *stk_size = *tls_addr - *stk_addr;
- *stk_size = RoundUp(*stk_size, kPageSize);
- uptr stk_end = *stk_addr + *stk_size;
- if (stk_end > *tls_addr) {
- *tls_size -= *tls_addr - stk_end;
- *tls_addr = stk_end;
- }
+ *stk_size -= *tls_size;
+ *tls_addr = *stk_addr + *stk_size;
}
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
index af23edb1966..05be9581806 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
@@ -76,6 +76,7 @@ ThreadContext::ThreadContext(int tid)
, reuse_count()
, epoch0()
, epoch1()
+ , dead_info()
, dead_next() {
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.h b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
index 9027f854a79..10f5890c6e1 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
@@ -207,7 +207,7 @@ class Shadow: public FastState {
// As if 8-byte write by thread 0xff..f at epoch 0xff..f, races with everything.
const u64 kShadowFreed = 0xfffffffffffffff8ull;
-const int kSigCount = 1024;
+const int kSigCount = 128;
const int kShadowStackSize = 1024;
struct my_siginfo_t {
@@ -301,8 +301,8 @@ struct ThreadContext {
u64 epoch0;
u64 epoch1;
StackTrace creation_stack;
- ThreadDeadInfo dead_info;
- ThreadContext* dead_next; // In dead thread list.
+ ThreadDeadInfo *dead_info;
+ ThreadContext *dead_next; // In dead thread list.
explicit ThreadContext(int tid);
};
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
index 6f6fb9eaf9f..d7aad3c3451 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
@@ -175,7 +175,9 @@ static void RestoreStack(int tid, const u64 epoch, StackTrace *stk) {
trace = &tctx->thr->trace;
} else if (tctx->status == ThreadStatusFinished
|| tctx->status == ThreadStatusDead) {
- trace = &tctx->dead_info.trace;
+ if (tctx->dead_info == 0)
+ return;
+ trace = &tctx->dead_info->trace;
} else {
return;
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
index fb44949c5fa..c13e6edf40d 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -20,7 +20,7 @@
namespace __tsan {
-const int kThreadQuarantineSize = 100;
+const int kThreadQuarantineSize = 16;
static void MaybeReportThreadLeak(ThreadContext *tctx) {
if (tctx->detached)
@@ -93,8 +93,7 @@ int ThreadCreate(ThreadState *thr, uptr pc, uptr uid, bool detached) {
tctx->status = ThreadStatusInvalid;
tctx->reuse_count++;
tid = tctx->tid;
- // The point to reclain dead_info.
- // delete tctx->dead_info;
+ DestroyAndFree(tctx->dead_info);
} else {
StatInc(thr, StatThreadMaxTid);
tid = ctx->thread_seq++;
@@ -207,13 +206,12 @@ void ThreadFinish(ThreadState *thr) {
}
// Save from info about the thread.
- // If dead_info will become dynamically allocated again,
- // it is the point to allocate it.
- // tctx->dead_info = new ThreadDeadInfo;
- internal_memcpy(&tctx->dead_info.trace.events[0],
+ tctx->dead_info = new(internal_alloc(MBlockDeadInfo, sizeof(ThreadDeadInfo)))
+ ThreadDeadInfo();
+ internal_memcpy(&tctx->dead_info->trace.events[0],
&thr->trace.events[0], sizeof(thr->trace.events));
for (int i = 0; i < kTraceParts; i++) {
- tctx->dead_info.trace.headers[i].stack0.CopyFrom(
+ tctx->dead_info->trace.headers[i].stack0.CopyFrom(
thr->trace.headers[i].stack0);
}
tctx->epoch1 = thr->clock.get(tctx->tid);
diff --git a/compiler-rt/lib/tsan/rtl/tsan_trace.h b/compiler-rt/lib/tsan/rtl/tsan_trace.h
index 4a1930d2059..f41a3f322db 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_trace.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_trace.h
@@ -20,7 +20,7 @@
namespace __tsan {
const int kTraceParts = 8;
-const int kTraceSize = 1024*1024;
+const int kTraceSize = 128*1024;
const int kTracePartSize = kTraceSize / kTraceParts;
// Must fit into 3 bits.
diff --git a/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc b/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc
index 10367accb1f..0418cfa4b57 100644
--- a/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc
+++ b/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc
@@ -352,6 +352,7 @@ ScopedThread::ScopedThread(bool detached, bool main) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, detached);
+ pthread_attr_setstacksize(&attr, 64*1024);
pthread_create(&impl_->thread, &attr,
ScopedThread::Impl::ScopedThreadCallback, impl_);
}
OpenPOWER on IntegriCloud