Signed-off-by: Martin Milata mmilata@redhat.com --- include/frame.h | 14 ++++++++++++++ lib/core_frame.c | 4 ++++ lib/core_thread.c | 2 +- lib/gdb_frame.c | 8 ++++++++ lib/gdb_thread.c | 2 +- lib/generic_frame.c | 18 ++++++++++++++++++ lib/generic_frame.h | 3 +++ lib/generic_thread.h | 4 ++-- lib/java_frame.c | 2 ++ lib/java_thread.c | 2 +- lib/koops_frame.c | 2 ++ lib/koops_stacktrace.c | 2 +- lib/python_frame.c | 2 ++ lib/python_stacktrace.c | 2 +- 14 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/include/frame.h b/include/frame.h index bb23419..9eda374 100644 --- a/include/frame.h +++ b/include/frame.h @@ -57,6 +57,20 @@ sr_frame_next(struct sr_frame *frame); void sr_frame_append_to_str(struct sr_frame *frame, struct sr_strbuf *strbuf);
+/** + * Compares two frames. Returns 0 on equality. Frames of distinct type are + * always unequal. + */ +int +sr_frame_cmp(struct sr_frame *t1, struct sr_frame *t2); + +/** + * Compares two frames for the purpose of thread distance computation. Returns + * 0 on equality. Frames of distinct type are always unequal. + */ +int +sr_frame_cmp_distance(struct sr_frame *t1, struct sr_frame *t2); + #ifdef __cplusplus } #endif diff --git a/lib/core_frame.c b/lib/core_frame.c index a2d1ef0..ac3f601 100644 --- a/lib/core_frame.c +++ b/lib/core_frame.c @@ -33,6 +33,8 @@ struct frame_methods core_frame_methods = { .append_to_str = (append_to_str_fn_t) sr_core_frame_append_to_str, .next = (next_frame_fn_t) core_next, + .cmp = (frame_cmp_fn_t) sr_core_frame_cmp, + .cmp_distance = (frame_cmp_fn_t) sr_core_frame_cmp_distance, };
/* Public functions */ @@ -176,6 +178,8 @@ int sr_core_frame_cmp_distance(struct sr_core_frame *frame1, struct sr_core_frame *frame2) { + /* TODO: we should not rely on function name and we definitely should use + * build id */ /* Function name. */ int function_name = sr_strcmp0(frame1->function_name, frame2->function_name); diff --git a/lib/core_thread.c b/lib/core_thread.c index 3ebf1d9..e97f806 100644 --- a/lib/core_thread.c +++ b/lib/core_thread.c @@ -34,7 +34,7 @@ DEFINE_NEXT_FUNC(core_next, struct sr_thread, struct sr_core_thread) struct thread_methods core_thread_methods = { .frames = (frames_fn_t) core_frames, - .cmp = (cmp_fn_t) sr_core_thread_cmp, + .cmp = (thread_cmp_fn_t) sr_core_thread_cmp, .frame_count = (frame_count_fn_t) thread_frame_count, .next = (next_thread_fn_t) core_next, }; diff --git a/lib/gdb_frame.c b/lib/gdb_frame.c index e3b30fb..f9e7f41 100644 --- a/lib/gdb_frame.c +++ b/lib/gdb_frame.c @@ -32,10 +32,18 @@
DEFINE_NEXT_FUNC(gdb_next, struct sr_frame, struct sr_gdb_frame)
+static int +frame_cmp_without_number(struct sr_gdb_frame *frame1, struct sr_gdb_frame *frame2) +{ + return sr_gdb_frame_cmp(frame1, frame2, false); +} + struct frame_methods gdb_frame_methods = { .append_to_str = (append_to_str_fn_t) sr_gdb_frame_append_to_str, .next = (next_frame_fn_t) gdb_next, + .cmp = (frame_cmp_fn_t) frame_cmp_without_number, + .cmp_distance = (frame_cmp_fn_t) sr_gdb_frame_cmp_distance, };
/* Public functions */ diff --git a/lib/gdb_thread.c b/lib/gdb_thread.c index 21acca3..e1af1f2 100644 --- a/lib/gdb_thread.c +++ b/lib/gdb_thread.c @@ -38,7 +38,7 @@ DEFINE_NEXT_FUNC(gdb_next, struct sr_thread, struct sr_gdb_thread) struct thread_methods gdb_thread_methods = { .frames = (frames_fn_t) gdb_frames, - .cmp = (cmp_fn_t) sr_gdb_thread_cmp, + .cmp = (thread_cmp_fn_t) sr_gdb_thread_cmp, .frame_count = (frame_count_fn_t) thread_frame_count, .next = (next_thread_fn_t) gdb_next, }; diff --git a/lib/generic_frame.c b/lib/generic_frame.c index 9041037..83d399e 100644 --- a/lib/generic_frame.c +++ b/lib/generic_frame.c @@ -43,3 +43,21 @@ sr_frame_next(struct sr_frame *frame) { return DISPATCH(dtable, frame->type, next)(frame); } + +int +sr_frame_cmp(struct sr_frame *frame1, struct sr_frame *frame2) +{ + if (frame1->type != frame2->type) + return frame1->type - frame2->type; + + return DISPATCH(dtable, frame1->type, cmp)(frame1, frame2); +} + +int +sr_frame_cmp_distance(struct sr_frame *frame1, struct sr_frame *frame2) +{ + if (frame1->type != frame2->type) + return frame1->type - frame2->type; + + return DISPATCH(dtable, frame1->type, cmp_distance)(frame1, frame2); +} diff --git a/lib/generic_frame.h b/lib/generic_frame.h index 5e28817..138123c 100644 --- a/lib/generic_frame.h +++ b/lib/generic_frame.h @@ -22,11 +22,14 @@
typedef void (*append_to_str_fn_t)(struct sr_frame *, struct sr_strbuf *); typedef struct sr_frame* (*next_frame_fn_t)(struct sr_frame *); +typedef int (*frame_cmp_fn_t)(struct sr_frame *, struct sr_frame *);
struct frame_methods { append_to_str_fn_t append_to_str; next_frame_fn_t next; + frame_cmp_fn_t cmp; + frame_cmp_fn_t cmp_distance; };
extern struct frame_methods core_frame_methods, python_frame_methods, diff --git a/lib/generic_thread.h b/lib/generic_thread.h index e1e5f0a..c53f6fe 100644 --- a/lib/generic_thread.h +++ b/lib/generic_thread.h @@ -21,14 +21,14 @@ #include "thread.h"
typedef struct sr_frame* (*frames_fn_t)(struct sr_thread*); -typedef int (*cmp_fn_t)(struct sr_thread*, struct sr_thread*); +typedef int (*thread_cmp_fn_t)(struct sr_thread*, struct sr_thread*); typedef int (*frame_count_fn_t)(struct sr_thread*); typedef struct sr_thread* (*next_thread_fn_t)(struct sr_thread*);
struct thread_methods { frames_fn_t frames; - cmp_fn_t cmp; + thread_cmp_fn_t cmp; frame_count_fn_t frame_count; next_thread_fn_t next; }; diff --git a/lib/java_frame.c b/lib/java_frame.c index fc8ae29..dfe9f86 100644 --- a/lib/java_frame.c +++ b/lib/java_frame.c @@ -39,6 +39,8 @@ struct frame_methods java_frame_methods = { .append_to_str = (append_to_str_fn_t) sr_java_frame_append_to_str, .next = (next_frame_fn_t) java_next, + .cmp = (frame_cmp_fn_t) sr_java_frame_cmp, + .cmp_distance = (frame_cmp_fn_t) sr_java_frame_cmp_distance, };
/* Public functions */ diff --git a/lib/java_thread.c b/lib/java_thread.c index ef5f73c..f149f76 100644 --- a/lib/java_thread.c +++ b/lib/java_thread.c @@ -38,7 +38,7 @@ DEFINE_NEXT_FUNC(java_next, struct sr_thread, struct sr_java_thread) struct thread_methods java_thread_methods = { .frames = (frames_fn_t) java_frames, - .cmp = (cmp_fn_t) sr_java_thread_cmp, + .cmp = (thread_cmp_fn_t) sr_java_thread_cmp, .frame_count = (frame_count_fn_t) thread_frame_count, .next = (next_thread_fn_t) java_next, }; diff --git a/lib/koops_frame.c b/lib/koops_frame.c index 76f5027..286bc94 100644 --- a/lib/koops_frame.c +++ b/lib/koops_frame.c @@ -36,6 +36,8 @@ struct frame_methods koops_frame_methods = { .append_to_str = (append_to_str_fn_t) sr_koops_frame_append_to_str, .next = (next_frame_fn_t) koops_next, + .cmp = (frame_cmp_fn_t) sr_koops_frame_cmp, + .cmp_distance = (frame_cmp_fn_t) sr_koops_frame_cmp_distance, };
/* Public functions */ diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c index 16d96a3..f6c4ccb 100644 --- a/lib/koops_stacktrace.c +++ b/lib/koops_stacktrace.c @@ -61,7 +61,7 @@ DEFINE_THREAD_FUNC(koops_frames, struct sr_koops_stacktrace) struct thread_methods koops_thread_methods = { .frames = (frames_fn_t) koops_frames, - .cmp = (cmp_fn_t) NULL, + .cmp = (thread_cmp_fn_t) NULL, .frame_count = (frame_count_fn_t) thread_frame_count, .next = (next_thread_fn_t) thread_no_next_thread, }; diff --git a/lib/python_frame.c b/lib/python_frame.c index 86ecb4e..e3ae238 100644 --- a/lib/python_frame.c +++ b/lib/python_frame.c @@ -35,6 +35,8 @@ struct frame_methods python_frame_methods = { .append_to_str = (append_to_str_fn_t) sr_python_frame_append_to_str, .next = (next_frame_fn_t) python_next, + .cmp = (frame_cmp_fn_t) sr_python_frame_cmp, + .cmp_distance = (frame_cmp_fn_t) sr_python_frame_cmp_distance, };
/* Public functions */ diff --git a/lib/python_stacktrace.c b/lib/python_stacktrace.c index 278d175..fbb0807 100644 --- a/lib/python_stacktrace.c +++ b/lib/python_stacktrace.c @@ -39,7 +39,7 @@ DEFINE_THREAD_FUNC(python_frames, struct sr_python_stacktrace) struct thread_methods python_thread_methods = { .frames = (frames_fn_t) python_frames, - .cmp = (cmp_fn_t) NULL, + .cmp = (thread_cmp_fn_t) NULL, .frame_count = (frame_count_fn_t) thread_frame_count, .next = (next_thread_fn_t) thread_no_next_thread, };