mirror of
https://github.com/abseil/abseil-cpp.git
synced 2026-06-04 12:07:05 +08:00
Use non-stack storage for stack trace buffers
Doing this opportunistically allows us to avoid performance overhead in the vast majority of calls (rare, non-reentrant ones) while simultaneously minimizing stack space usage. PiperOrigin-RevId: 831560881 Change-Id: Idc6ba1dd0dcf1b4aaf3ee7cf468054bcfdcf90af
This commit is contained in:
committed by
Copybara-Service
parent
e6a6acdca4
commit
03cc841ff0
@@ -12,12 +12,25 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "absl/base/attributes.h"
|
||||
#include "absl/base/config.h"
|
||||
#include "absl/base/optimization.h"
|
||||
#include "absl/cleanup/cleanup.h"
|
||||
#include "absl/debugging/stacktrace.h"
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
static bool g_enable_fixup = false;
|
||||
|
||||
#if ABSL_HAVE_ATTRIBUTE_WEAK
|
||||
// Override these weak symbols if possible.
|
||||
bool absl::internal_stacktrace::ShouldFixUpStack() { return g_enable_fixup; }
|
||||
void absl::internal_stacktrace::FixUpStack(void**, uintptr_t*, int*, size_t,
|
||||
size_t&) {}
|
||||
#endif
|
||||
|
||||
namespace absl {
|
||||
ABSL_NAMESPACE_BEGIN
|
||||
namespace {
|
||||
@@ -42,14 +55,24 @@ ABSL_ATTRIBUTE_NOINLINE void func(benchmark::State& state, int x, int depth) {
|
||||
func(state, --x, depth);
|
||||
}
|
||||
|
||||
template <bool EnableFixup>
|
||||
void BM_GetStackTrace(benchmark::State& state) {
|
||||
const Cleanup restore_state(
|
||||
[prev = g_enable_fixup]() { g_enable_fixup = prev; });
|
||||
g_enable_fixup = EnableFixup;
|
||||
int depth = state.range(0);
|
||||
for (auto s : state) {
|
||||
func(state, depth, depth);
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK(BM_GetStackTrace)->DenseRange(10, kMaxStackDepth, 10);
|
||||
#if ABSL_HAVE_ATTRIBUTE_WEAK
|
||||
auto& BM_GetStackTraceWithFixup = BM_GetStackTrace<true>;
|
||||
BENCHMARK(BM_GetStackTraceWithFixup)->DenseRange(10, kMaxStackDepth, 10);
|
||||
#endif
|
||||
|
||||
auto& BM_GetStackTraceWithoutFixup = BM_GetStackTrace<false>;
|
||||
BENCHMARK(BM_GetStackTraceWithoutFixup)->DenseRange(10, kMaxStackDepth, 10);
|
||||
} // namespace
|
||||
ABSL_NAMESPACE_END
|
||||
} // namespace absl
|
||||
|
||||
Reference in New Issue
Block a user