From c1fbf91b2ffcb5a009d64493c5eb84307b2960f6 Mon Sep 17 00:00:00 2001 From: Tomas Kolda Date: Thu, 20 Apr 2017 10:59:04 -0700 Subject: [PATCH] Fixing Solaris Sparc crash due to cached TLS Summary: Workaround for Solaris gcc binary. Program is crashing, because when TLS of perf context that is used twice on same frame, it is damaged thus Segmentation fault. Issue: #2153 Closes https://github.com/facebook/rocksdb/pull/2187 Differential Revision: D4922274 Pulled By: siying fbshipit-source-id: 549105ebce9a8ce08a737f4d6b9f2312ebcde9a8 --- include/rocksdb/perf_context.h | 7 ++++++- monitoring/perf_context.cc | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/rocksdb/perf_context.h b/include/rocksdb/perf_context.h index 80598bb2f..76a5cac68 100644 --- a/include/rocksdb/perf_context.h +++ b/include/rocksdb/perf_context.h @@ -155,7 +155,12 @@ extern PerfContext perf_context; #elif defined(_MSC_VER) extern __declspec(thread) PerfContext perf_context; #else -extern __thread PerfContext perf_context; + #if defined(OS_SOLARIS) + PerfContext *getPerfContext(); + #define perf_context (*getPerfContext()) + #else + extern __thread PerfContext perf_context; + #endif #endif } diff --git a/monitoring/perf_context.cc b/monitoring/perf_context.cc index 69b33fca4..2f876f7f1 100644 --- a/monitoring/perf_context.cc +++ b/monitoring/perf_context.cc @@ -14,7 +14,11 @@ namespace rocksdb { #elif defined(_MSC_VER) __declspec(thread) PerfContext perf_context; #else - __thread PerfContext perf_context; + #if defined(OS_SOLARIS) + __thread PerfContext perf_context_; + #else + __thread PerfContext perf_context; + #endif #endif void PerfContext::Reset() { @@ -162,4 +166,10 @@ std::string PerfContext::ToString(bool exclude_zero_counters) const { #endif } +#if defined(OS_SOLARIS) +PerfContext *getPerfContext() { + return &perf_context_; +} +#endif + }