[ovs-dev] [PATCH] backtrace: Remove variant that does not support threads.

Ethan Jackson ethan at nicira.com
Mon Jun 17 19:33:44 UTC 2013


I assume this means you think the backtrace function built into glibc
is thread safe?

Acked-by: Ethan Jackson <ethan at nicira.com>

On Thu, Jun 13, 2013 at 5:15 PM, Ben Pfaff <blp at nicira.com> wrote:
> 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 at nicira.com>
> ---
>  lib/backtrace.c |   86 +-----------------------------------------------------
>  1 files changed, 2 insertions(+), 84 deletions(-)
>
> diff --git a/lib/backtrace.c b/lib/backtrace.c
> index c6829d7..861a109 100644
> --- a/lib/backtrace.c
> +++ b/lib/backtrace.c
> @@ -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)
>  {
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list