log: Add return-checking macros for 0 being success
The existing log_ret() and log_msg_ret() macros consider an error to be less than zero. But some function may return a positive number to indicate a different kind of failure. Add macros to check for that also. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									9ad7a6c25c
								
							
						
					
					
						commit
						7bd06587de
					
				|  | @ -117,11 +117,24 @@ can be used whenever your function returns an error value: | ||||||
| 
 | 
 | ||||||
| .. code-block:: c | .. code-block:: c | ||||||
| 
 | 
 | ||||||
|    return log_ret(uclass_first_device(UCLASS_MMC, &dev)); |    return log_ret(uclass_first_device_err(UCLASS_MMC, &dev)); | ||||||
| 
 | 
 | ||||||
| This will write a log record when an error code is detected (a value < 0). This | This will write a log record when an error code is detected (a value < 0). This | ||||||
| can make it easier to trace errors that are generated deep in the call stack. | can make it easier to trace errors that are generated deep in the call stack. | ||||||
| 
 | 
 | ||||||
|  | The log_msg_ret() variant will print a short string if CONFIG_LOG_ERROR_RETURN | ||||||
|  | is enabled. So long as the string is unique within the function you can normally | ||||||
|  | determine exactly which call failed: | ||||||
|  | 
 | ||||||
|  | .. code-block:: c | ||||||
|  | 
 | ||||||
|  |    ret = gpio_request_by_name(dev, "cd-gpios", 0, &desc, GPIOD_IS_IN); | ||||||
|  |    if (ret) | ||||||
|  |       return log_msg_ret("gpio", ret); | ||||||
|  | 
 | ||||||
|  | Some functions return 0 for success and any other value is an error. For these, | ||||||
|  | log_retz() and log_msg_retz() are available. | ||||||
|  | 
 | ||||||
| Convenience functions | Convenience functions | ||||||
| ~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -316,10 +316,30 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line, | ||||||
| 		    __ret); \ | 		    __ret); \ | ||||||
| 	__ret; \ | 	__ret; \ | ||||||
| 	}) | 	}) | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Similar to the above, but any non-zero value is consider an error, not just | ||||||
|  |  * values less than 0. | ||||||
|  |  */ | ||||||
|  | #define log_retz(_ret) ({ \ | ||||||
|  | 	int __ret = (_ret); \ | ||||||
|  | 	if (__ret) \ | ||||||
|  | 		log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \ | ||||||
|  | 	__ret; \ | ||||||
|  | 	}) | ||||||
|  | #define log_msg_retz(_msg, _ret) ({ \ | ||||||
|  | 	int __ret = (_ret); \ | ||||||
|  | 	if (__ret) \ | ||||||
|  | 		log(LOG_CATEGORY, LOGL_ERR, "%s: returning err=%d\n", _msg, \ | ||||||
|  | 		    __ret); \ | ||||||
|  | 	__ret; \ | ||||||
|  | 	}) | ||||||
| #else | #else | ||||||
| /* Non-logging versions of the above which just return the error code */ | /* Non-logging versions of the above which just return the error code */ | ||||||
| #define log_ret(_ret) (_ret) | #define log_ret(_ret) (_ret) | ||||||
| #define log_msg_ret(_msg, _ret) ((void)(_msg), _ret) | #define log_msg_ret(_msg, _ret) ((void)(_msg), _ret) | ||||||
|  | #define log_retz(_ret) (_ret) | ||||||
|  | #define log_msg_retz(_msg, _ret) ((void)(_msg), _ret) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /** * enum log_rec_flags - Flags for a log record */ | /** * enum log_rec_flags - Flags for a log record */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue