projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
netdev-linux: "Down" tap devices before setting hw addr.
[openvswitch]
/
lib
/
backtrace.c
diff --git
a/lib/backtrace.c
b/lib/backtrace.c
index 131bdf4fc87881d3440964745579ef842f6c71d9..c6829d77c19bda1feef4cec6ad8f58ae40266145 100644
(file)
--- a/
lib/backtrace.c
+++ b/
lib/backtrace.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (c) 2008, 2009, 2010
Nicira Networks
.
+ * Copyright (c) 2008, 2009, 2010
, 2011 Nicira, Inc
.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@
-15,17
+15,34
@@
*/
#include <config.h>
*/
#include <config.h>
+
#include "backtrace.h"
#include "backtrace.h"
+
#include <errno.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <errno.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
+
#include "compiler.h"
#include "vlog.h"
#include "compiler.h"
#include "vlog.h"
-VLOG_DEFINE_THIS_MODULE(backtrace)
+VLOG_DEFINE_THIS_MODULE(backtrace);
+
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+void
+backtrace_capture(struct backtrace *b)
+{
+ void *frames[BACKTRACE_MAX_FRAMES];
+ int i;
-static uintptr_t OVS_UNUSED
+ b->n_frames = backtrace(frames, BACKTRACE_MAX_FRAMES);
+ for (i = 0; i < b->n_frames; i++) {
+ b->frames[i] = (uintptr_t) frames[i];
+ }
+}
+#elif __GNUC__
+static uintptr_t
get_max_stack(void)
{
static const char file_name[] = "/proc/self/maps";
get_max_stack(void)
{
static const char file_name[] = "/proc/self/maps";
@@
-69,20
+86,8
@@
stack_high(void)
static uintptr_t
stack_low(void)
{
static uintptr_t
stack_low(void)
{
-#ifdef __i386__
- uintptr_t low;
- asm("movl %%esp,%0" : "=g" (low));
- return low;
-#elif __x86_64__
- uintptr_t low;
- asm("movq %%rsp,%0" : "=g" (low));
+ uintptr_t low = (uintptr_t) &low;
return low;
return low;
-#else
- /* This causes a warning in GCC that cannot be disabled, so use it only on
- * non-x86. */
- int dummy;
- return (uintptr_t) &dummy;
-#endif
}
static bool
}
static bool
@@
-108,3
+113,10
@@
backtrace_capture(struct backtrace *backtrace)
}
backtrace->n_frames = n;
}
}
backtrace->n_frames = n;
}
+#else /* !HAVE_BACKTRACE && !__GNUC__ */
+void
+backtrace_capture(struct backtrace *backtrace)
+{
+ backtrace->n_frames = 0;
+}
+#endif