mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
backtrace: Remove variant that does not support threads.
This variant was Linux-specific, GCC-specific, only worked on architectures with frame pointers (possibly only on i386?), and isn't used with glibc anyway. Remove it. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Ethan Jackson <ethan@nicira.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
|
||||
* Copyright (c) 2008, 2009, 2010, 2011, 2013 Nicira, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,16 +18,6 @@
|
||||
|
||||
#include "backtrace.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "compiler.h"
|
||||
#include "vlog.h"
|
||||
|
||||
VLOG_DEFINE_THIS_MODULE(backtrace);
|
||||
|
||||
#ifdef HAVE_BACKTRACE
|
||||
#include <execinfo.h>
|
||||
void
|
||||
@@ -41,79 +31,7 @@ backtrace_capture(struct backtrace *b)
|
||||
b->frames[i] = (uintptr_t) frames[i];
|
||||
}
|
||||
}
|
||||
#elif __GNUC__
|
||||
static uintptr_t
|
||||
get_max_stack(void)
|
||||
{
|
||||
static const char file_name[] = "/proc/self/maps";
|
||||
char line[1024];
|
||||
int line_number;
|
||||
FILE *f;
|
||||
|
||||
f = fopen(file_name, "r");
|
||||
if (f == NULL) {
|
||||
VLOG_WARN("opening %s failed: %s", file_name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (line_number = 1; fgets(line, sizeof line, f); line_number++) {
|
||||
if (strstr(line, "[stack]")) {
|
||||
uintptr_t end;
|
||||
if (sscanf(line, "%*x-%"SCNxPTR, &end) != 1) {
|
||||
VLOG_WARN("%s:%d: parse error", file_name, line_number);
|
||||
continue;
|
||||
}
|
||||
fclose(f);
|
||||
return end;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
VLOG_WARN("%s: no stack found", file_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static uintptr_t
|
||||
stack_high(void)
|
||||
{
|
||||
static uintptr_t high;
|
||||
if (!high) {
|
||||
high = get_max_stack();
|
||||
}
|
||||
return high;
|
||||
}
|
||||
|
||||
static uintptr_t
|
||||
stack_low(void)
|
||||
{
|
||||
uintptr_t low = (uintptr_t) &low;
|
||||
return low;
|
||||
}
|
||||
|
||||
static bool
|
||||
in_stack(void *p)
|
||||
{
|
||||
uintptr_t address = (uintptr_t) p;
|
||||
return address >= stack_low() && address < stack_high();
|
||||
}
|
||||
|
||||
void
|
||||
backtrace_capture(struct backtrace *backtrace)
|
||||
{
|
||||
void **frame;
|
||||
size_t n;
|
||||
|
||||
n = 0;
|
||||
for (frame = __builtin_frame_address(1);
|
||||
frame != NULL && in_stack(frame) && frame[0] != NULL
|
||||
&& n < BACKTRACE_MAX_FRAMES;
|
||||
frame = frame[0])
|
||||
{
|
||||
backtrace->frames[n++] = (uintptr_t) frame[1];
|
||||
}
|
||||
backtrace->n_frames = n;
|
||||
}
|
||||
#else /* !HAVE_BACKTRACE && !__GNUC__ */
|
||||
#else
|
||||
void
|
||||
backtrace_capture(struct backtrace *backtrace)
|
||||
{
|
||||
|
Reference in New Issue
Block a user