From 5a50dba2c0832c58593e6aa88dd2144f64f0c544 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 13 Apr 2019 00:46:50 +0200 Subject: Enable prefetching backtace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- internal.c | 1 + internal.h | 4 +--- liberror.h | 18 ++++++++++++++++++ set_error.c | 7 ++++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/internal.c b/internal.c index 034a2db..bad884e 100644 --- a/internal.c +++ b/internal.c @@ -4,3 +4,4 @@ _Thread_local struct liberror_error liberror_error_; _Thread_local int liberror_have_error_; +_Thread_local struct liberror_backtrace *liberror_saved_backtrace; diff --git a/internal.h b/internal.h index eb122ed..db33be9 100644 --- a/internal.h +++ b/internal.h @@ -29,6 +29,4 @@ struct liberror_backtrace { HIDDEN extern _Thread_local struct liberror_error liberror_error_; HIDDEN extern _Thread_local int liberror_have_error_; - - -int liberror_save_backtrace(struct liberror_error *); +extern _Thread_local struct liberror_backtrace *liberror_saved_backtrace; diff --git a/liberror.h b/liberror.h index 508dbac..7b5176a 100644 --- a/liberror.h +++ b/liberror.h @@ -179,6 +179,24 @@ void liberror_reset_error(void); */ void liberror_print_backtrace(struct liberror_error *, FILE *, const char *); +/** + * Get backtrace and save backtrace + * + * This function will never change `errno` + * + * Note: this library does not actually save + * a backtrace, `-lerror-backtrace` is needed + * for that functionallity (it will replace + * some things in this library, so no other + * action is required) + * + * @param error The error the backtrace shall be stored in, + * if `NULL`, the backtrafe is saved for the + * next error in the thread + * @return 0 on success, -1 on failure + */ +int liberror_save_backtrace(struct liberror_error *); + /** * Set the current error for the thread * diff --git a/set_error.c b/set_error.c index 38617c7..a44aac6 100644 --- a/set_error.c +++ b/set_error.c @@ -33,7 +33,12 @@ liberror_set_error(const char description[256], const char source[64], const cha stpcpy(error->source, source); stpcpy(error->code_group, code_group); error->code = code; - liberror_save_backtrace(error); + if (liberror_saved_backtrace) { + error->backtrace = liberror_saved_backtrace; + liberror_saved_backtrace = NULL; + } else { + liberror_save_backtrace(error); + } error->cause = cause; error->failed_to_allocate_cause = have_cause && !cause; } -- cgit v1.2.3-70-g09d2