diff options
-rw-r--r-- | internal.c | 1 | ||||
-rw-r--r-- | internal.h | 4 | ||||
-rw-r--r-- | liberror.h | 18 | ||||
-rw-r--r-- | set_error.c | 7 |
4 files changed, 26 insertions, 4 deletions
@@ -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; @@ -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; @@ -180,6 +180,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 * * If the thread already has an error saved, 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; } |