diff options
Diffstat (limited to '')
| -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;  } | 
