]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
log: Add return-checking macros for 0 being success
authorSimon Glass <sjg@chromium.org>
Thu, 21 Jan 2021 03:10:54 +0000 (20:10 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 12 Mar 2021 22:41:35 +0000 (17:41 -0500)
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>
doc/develop/logging.rst
include/log.h

index 622ad6ad1af2867e4f6f8f19b155d8247e8aaefa..f4e925048e8d35daf99cf5f77be07f6224083892 100644 (file)
@@ -117,11 +117,24 @@ can be used whenever your function returns an error value:
 
 .. 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
 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
 ~~~~~~~~~~~~~~~~~~~~~
 
index c0453d2f97c1ee9cc89c165799a10535dbd797b5..6ef891d4d2d2cf9e66e2706b03cf900c090d1973 100644 (file)
@@ -316,10 +316,30 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line,
                    __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
 /* Non-logging versions of the above which just return the error code */
 #define log_ret(_ret) (_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
 
 /** * enum log_rec_flags - Flags for a log record */