Signed-off-by: Martin Milata mmilata@redhat.com --- include/thread.h | 7 +++++++ lib/core_thread.c | 2 ++ lib/gdb_thread.c | 1 + lib/generic_thread.c | 12 ++++++++++++ lib/generic_thread.h | 5 +++++ lib/java_thread.c | 1 + lib/koops_stacktrace.c | 1 + lib/python_stacktrace.c | 1 + 8 files changed, 30 insertions(+)
diff --git a/include/thread.h b/include/thread.h index 56bf1b5..c62c08f 100644 --- a/include/thread.h +++ b/include/thread.h @@ -118,6 +118,13 @@ sr_thread_remove_frames_above(struct sr_thread *thread, struct sr_frame *frame); struct sr_thread * sr_thread_dup(struct sr_thread *thread);
+/** + * Normalizes thread for deduplication/clustering. The normalization consists + * of removing useless frames and changing names of others. + */ +void +sr_thread_normalize(struct sr_thread *thread); + #ifdef __cplusplus } #endif diff --git a/lib/core_thread.c b/lib/core_thread.c index d6e62b2..fc5f9e7 100644 --- a/lib/core_thread.c +++ b/lib/core_thread.c @@ -25,6 +25,7 @@ #include "generic_thread.h" #include "stacktrace.h" #include "internal_utils.h" +#include "normalize.h" #include <string.h>
/* Method table */ @@ -50,6 +51,7 @@ struct thread_methods core_thread_methods = .remove_frames_above = (remove_frames_above_fn_t) thread_remove_frames_above, .thread_dup = (thread_dup_fn_t) core_dup, + .normalize = (normalize_fn_t) sr_normalize_core_thread, };
/* Public functions */ diff --git a/lib/gdb_thread.c b/lib/gdb_thread.c index dc34320..ec08609 100644 --- a/lib/gdb_thread.c +++ b/lib/gdb_thread.c @@ -58,6 +58,7 @@ struct thread_methods gdb_thread_methods = .remove_frames_above = (remove_frames_above_fn_t) thread_remove_frames_above, .thread_dup = (thread_dup_fn_t) gdb_dup, + .normalize = (normalize_fn_t) sr_normalize_gdb_thread, };
/* Public functions */ diff --git a/lib/generic_thread.c b/lib/generic_thread.c index c9ff98a..4b17a63 100644 --- a/lib/generic_thread.c +++ b/lib/generic_thread.c @@ -111,6 +111,12 @@ thread_no_bthash_text(struct sr_thread *thread, enum sr_bthash_flags flags, /* nop */ }
+void +thread_no_normalization(struct sr_thread *thread) +{ + /* nop */ +} + /* Initialize dispatch table. */
/* Table that maps type-specific functions to the corresponding report types. @@ -201,3 +207,9 @@ sr_thread_dup(struct sr_thread *thread) { return DISPATCH(dtable, thread->type, thread_dup)(thread); } + +void +sr_thread_normalize(struct sr_thread *thread) +{ + DISPATCH(dtable, thread->type, normalize)(thread); +} diff --git a/lib/generic_thread.h b/lib/generic_thread.h index 3914212..005e5ac 100644 --- a/lib/generic_thread.h +++ b/lib/generic_thread.h @@ -34,6 +34,7 @@ typedef void (*set_next_thread_fn_t)(struct sr_thread*, struct sr_thread*); typedef void (*thread_append_bthash_text_fn_t)(struct sr_thread*, enum sr_bthash_flags, struct sr_strbuf*); typedef void (*thread_free_fn_t)(struct sr_thread*); +typedef void (*normalize_fn_t)(struct sr_thread*); typedef bool (*remove_frame_fn_t)(struct sr_thread*, struct sr_frame*); typedef bool (*remove_frames_above_fn_t)(struct sr_thread*, struct sr_frame*); typedef struct sr_thread* (*thread_dup_fn_t)(struct sr_thread*); @@ -48,6 +49,7 @@ struct thread_methods set_next_thread_fn_t set_next; thread_append_bthash_text_fn_t thread_append_bthash_text; thread_free_fn_t thread_free; + normalize_fn_t normalize; remove_frame_fn_t remove_frame; remove_frames_above_fn_t remove_frames_above; thread_dup_fn_t thread_dup; @@ -87,6 +89,9 @@ void thread_no_bthash_text(struct sr_thread *thread, enum sr_bthash_flags flags, struct sr_strbuf *strbuf);
+void +thread_no_normalization(struct sr_thread *thread); + /* Uses dispatch table but not intended for public use. */ void thread_append_bthash_text(struct sr_thread *thread, enum sr_bthash_flags flags, diff --git a/lib/java_thread.c b/lib/java_thread.c index 644ac34..9f6145d 100644 --- a/lib/java_thread.c +++ b/lib/java_thread.c @@ -58,6 +58,7 @@ struct thread_methods java_thread_methods = .remove_frames_above = (remove_frames_above_fn_t) thread_remove_frames_above, .thread_dup = (thread_dup_fn_t) java_dup, + .normalize = (normalize_fn_t) thread_no_normalization, };
/* Public functions */ diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c index ab62598..4ba74db 100644 --- a/lib/koops_stacktrace.c +++ b/lib/koops_stacktrace.c @@ -78,6 +78,7 @@ struct thread_methods koops_thread_methods = .remove_frames_above = (remove_frames_above_fn_t) thread_remove_frames_above, .thread_dup = (thread_dup_fn_t) sr_koops_stacktrace_dup, + .normalize = (normalize_fn_t) sr_normalize_koops_stacktrace, };
struct stacktrace_methods koops_stacktrace_methods = diff --git a/lib/python_stacktrace.c b/lib/python_stacktrace.c index 15bb41c..b7c69cf 100644 --- a/lib/python_stacktrace.c +++ b/lib/python_stacktrace.c @@ -57,6 +57,7 @@ struct thread_methods python_thread_methods = .remove_frames_above = (remove_frames_above_fn_t) thread_remove_frames_above, .thread_dup = (thread_dup_fn_t) sr_python_stacktrace_dup, + .normalize = (normalize_fn_t) thread_no_normalization, };
struct stacktrace_methods python_stacktrace_methods =